浅复制(shallow copying) 与 深复制(deep copying)
复制(cloning 克隆)是为了建立一个和原类型实例完全相同的副本。
要实现浅复制,只需要调用Object类的MemberwiseClone方法即可。
如下示例:
浅复制的缺点是,如果原对象中包含引用类型字段,那么复制之后的对象的引用类型字段与之指向同一个对象,这可能并不是我们所期望的。
打个比方,假设我们复制了一个bill gates,在复制的时候把他身上的银行卡也复制了一份,那么将会产生的问题是两张银行卡指向银行卡的同一账户。两张银行卡的任意操作都会影响到另一张(取款、注销)。
此时我们考虑使用深复制,除了建立原对象的一个副本,还为原对象中每个引用类型字段分别建立副本。在C#中通常是实现ICloneable接口并实现其中的Clone方法来完成。
先看下浅复制的情况:
在上面的案例中d1.Data和d2.Data为同一引用,会互相影响,如果想让d2.Data与d1.Data无关,可以考虑在Clone方法里生成新的对象。
请参考以下示例:
上面的案例复制还较为简单,如果List里面的数据还是引用类型...那我们就有的忙了,而且如果类中的对象包含循环引用也会很麻烦。
如果对象中的所有成员都支持可串行化,我们可以先将对象串行化为一个内存流,然后逆串行化为一个新对象,再返回给调用者。