C#基础系列(10)-- 第三部分 面向对象相关 -- 浅复制与深复制(3)

浅复制(shallow copying) 与 深复制(deep copying)

 

复制(cloning 克隆)是为了建立一个和原类型实例完全相同的副本。

要实现浅复制,只需要调用Object类的MemberwiseClone方法即可。

如下示例:

 

浅复制的缺点是,如果原对象中包含引用类型字段,那么复制之后的对象的引用类型字段与之指向同一个对象,这可能并不是我们所期望的。

打个比方,假设我们复制了一个bill gates,在复制的时候把他身上的银行卡也复制了一份,那么将会产生的问题是两张银行卡指向银行卡的同一账户。两张银行卡的任意操作都会影响到另一张(取款、注销)。

此时我们考虑使用深复制,除了建立原对象的一个副本,还为原对象中每个引用类型字段分别建立副本。在C#中通常是实现ICloneable接口并实现其中的Clone方法来完成。

先看下浅复制的情况:


在上面的案例中d1.Data和d2.Data为同一引用,会互相影响,如果想让d2.Data与d1.Data无关,可以考虑在Clone方法里生成新的对象。

请参考以下示例:


上面的案例复制还较为简单,如果List里面的数据还是引用类型...那我们就有的忙了,而且如果类中的对象包含循环引用也会很麻烦。

如果对象中的所有成员都支持可串行化,我们可以先将对象串行化为一个内存流,然后逆串行化为一个新对象,再返回给调用者。

 

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值