DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

2012年3月12日

摘要: C#中有两种类型变量,一种 是值类型变量,一种是引用类型变量,对于值类型变量,深拷贝和前拷贝都是通过赋值操作符号(=)实现,其效果一致,将对象中的值类型的字段拷贝到新的对象中.这个很容易理解。 本文重点讨论引用类型变量的拷贝机制和实现。 C#中引用类型对象的copy操作有两种: 浅拷贝(影子克隆/shallow copy):只复制对象的值类型字段,对象的引用类型,仍属于原来的引用. 深拷贝(深度克隆):不仅复制对象的值类型字段,同时也复制原对象中的对象.就是说完全是新对象产生的. 浅拷贝和深拷贝之间的区别:浅拷贝是指将对象中的数值类型的字段拷贝到新的对象中,而对象中的引用型字段则指复制... 阅读全文
posted @ 2012-03-12 20:07 DoubleLi 阅读(27282) 评论(1) 推荐(0)

摘要: 关于浅拷贝和深拷贝,我的理解不是很清晰,简单说来,我认为是这样子: 浅拷贝:引用成员在被拷贝时仅复制源对象中引用成员的地址到新对象中,所以在新对象中对引用成员进行更改会影响到源对象(除对引用成员进行赋值外)。 深拷贝:引用成员在拷贝时新建一个引用对象到新对象中,且将源对象中引用对象的成员值复制到新对象的引用对象中,所以在新对象中对引用成员进行更改不会影响源对象。 说起来概念也简单,我想大家纠结的是如何实现深拷贝?浅拷贝的实现很简单,调用Object.MemberwiseClone就万事大吉了。在网上找了一个通过序列化实现深拷贝的例子,自己改了改,欢迎大家品头论足。 这段程序的输出为:... 阅读全文
posted @ 2012-03-12 20:04 DoubleLi 阅读(3496) 评论(1) 推荐(0)

摘要: 应用场景对一个集合进行深拷贝复制,实现的方法有不少,现举一个常规实现方案:例如已有一个List<T> someListList<T> newList = new List<T>();foreach(var item in someList){ T t = new T(); //此处的属性如果是引用类型,还需要考虑该类型的深拷贝实现 t.P1 = item.P1; t.P2 = item.P2; ... newList.Add(t);}复制代码如果类似的需求不止一个,那我们就要反复书写类似的代码,这显然不符合代码重用的原则。思路首先想到的应该是扩展... 阅读全文
posted @ 2012-03-12 19:46 DoubleLi 阅读(294) 评论(0) 推荐(0)