欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 »  .NET本质论第一卷:公共语言运行库教程 » 正文

本教程章节列表

克隆-浅表副本与深层副本

创建时间:2012年11月22日 21:07  阅读次数:(6200)
分享到:
克隆
当将一个引用变量赋值绐另外一个引用变量时,只是简单地创建了指向同一个对象的第二个引用。如果要制造一个对象的副本,你就需要某种机制来创建同一个类的新实例,并且基于原来对象的状态初始化该实例。Object.MemberwiseClone方法就是做这件事情的;然而,它不是一个公有办法。更进一步说,如果对象要想支持克隆( cloning),往往需要实现System.ICloneable接口,该接口有一个方法Clone:
namespace System {
public interface ICloneable
{
Object Clone() ;
}

MemberwiseClone方法执行的是浅表副本(shallow copy),这意味着它只是将原对象的每个字段的值拷贝到克隆体中。如果字段是一个对象引用,那么,拷贝的仅仅是这个引用.而不是引用的对象。下面的类使用浅表副本实现了ICloneable接口:
Pulic sealed class Marriage:System.ICloneable{
Internal Person g;
Internal Person b;

Public Object Clone(){
Return this.MemberwiseClone();
}
}

图5.9是浅表副本的结果。




深层副本(deep copy)是指递归拷贝其字段所引用的所有对象,如图5.10所示。深层副本经常是人们所期望的;但它不是默认的行为,并且在一般情形下实现深层副本也不是好主意。深层副本除了会引起额外的内存活动和资源消耗之外,当对象层次结构( a graph of objects)出现环路时,深层副本还会出现问题,其原因是递归有可能陷入无限循环。不过,对于简单的对象层次结构,它全少是可以实现的,如下例5.8所示。

示例5.8 实现System.ICloneable接口
Public sealed class Marriage:System.ICloneable{
Internal Person g;
Internal Person b;
Public Object Clone(){
//首先进行浅拷贝
Marriage result=(Marriage)this.MemberwiseClone();
//深拷贝每个字段
Result.g=(Person){this.g.Clone()};
Result.b=(Person){this.b.Clone()};
Return result;
}
}

在示例5.8中,Clone的实现居然可以不调用MemberwisClone方法。一个可供选择的实现就是简单地使用new操作符实例化第二个对象,并且手动产生它的字段。此外你还可以定义一个私有构造函数,使这两个部分(实例化和初始化)合并成一步。示例5.9就是这样一种实现。

示例5.9  使用关键字new实现System.ICloneable接口
Public sealed class Marriage:System.ICloneable{
Internal Person g;
Internal Person b;

Private Marriage(Person g,Person b){
This.g=(Person)g.Clone();
This.b=(Person)b.Clone();
}

Public Object Clone(){
Return new Marriage(g,b)
}
}
来源:.net学习网
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf】

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 98+68=? 的结果(结果是:166)
结  果: