.NET基础之深度复制和浅度复制
2018-06-18 03:04:38来源:未知 阅读 ()
之前一直没有搞清楚深度复制和浅度复制的区别到底在哪里,今天彻底把这个东西弄懂了,写出来与到家共勉。
如果大家不懂值类型和引用类型的区别,请先看http://www.cnblogs.com/Autumoon/archive/2008/08/18/1270685.html,本来想自己写的,但刚好看到了这篇写的非常全面,就不自己写了。
大家都知道Object是所有类共同的基类,其有个方法是MemberwiseClone(),其用途为
我们可以通过这个方法来达到浅度复制的效果。
下面我们通过一个例子来阐述一下浅度复制,其与深度复制的区别在什么地方:
public class Content { public int Val; } public class Cloner { public Content MyContent = new Content(); public Cloner(int newVal) { MyContent.Val = newVal; } public object GetCopy() { return MemberwiseClone(); } }
在这里我们有两个类,一个Content类,只有一个为值类型int的Val,还有个类是一个Cloner类,其有一个Content类型的成员,然后有个构造函数可以初始化成员,最后有一个GetCopy的方法,通过MemberwiseClone方法来复制自己。
下面我们通过一段代码来调用Cloner类:
static void Main(string[] args) { Cloner source = new Cloner(10); Cloner target = (Cloner)source.GetCopy();//返回的是一个Object类型 需要做类型转换. Console.WriteLine("target.MyContent.Val = {0}", target.MyContent.Val); source.MyContent.Val = 15; Console.WriteLine("target.MyContent.Val = {0}", target.MyContent.Val); Console.ReadKey(); }
结果是:
我们可以看到我们通过GetCopy()函数复制类source给target,但是当我们改变source的时候,source输出的值也跟着改变。由此我们可以得出,我们通过MemberwiseClone()复制的只是引用,即source和target的MyContent是相同的对象实例。这就是浅度复制,那我们如何实现深度复制呢,在.NET Framework中,给我们提供了ICloneable接口。
首先我们看下ICloneable接口:
// 摘要: // 支持克隆,即用与现有实例相同的值创建类的新实例。 [ComVisible(true)] public interface ICloneable { // 摘要: // 创建作为当前实例副本的新对象。 // // 返回结果: // 作为此实例副本的新对象。 object Clone(); }
在上面那个例子中,我们只需要修改一些代码就可以了:
public class Cloner:ICloneable { public Content MyContent = new Content(); public Cloner(int newVal) { MyContent.Val = newVal; } //public object GetCopy() //{ // return MemberwiseClone(); //} public object Clone() { Cloner cloned = new Cloner(MyContent.Val); return cloned; } }
为了做区别我把之前的代码放在上面,注释了的代码就是浅度复制,后面的为深度复制,我们看到差别在于用本实例的MyContent.Val重新生成了实例返回给目标,测试结果为:
这里如果MyContent的成员不是一个值类型,那么我们还需要进行深度,像下面一样:
public object Clone() { Cloner cloned = new Cloner(); cloned.MyContent = MyContent.Clone(); return cloned; }
深度复制和浅度复制就是这样,关键是创建一个新的对象实例返回去,而不是把原来的对象实例返回回去。大家懂了吗?
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:后台与前台线程
下一篇:C#:获取视频某一帧的缩略图
- 如何0基础学习C/C++? 2020-06-06
- 复习C++语法--基础篇 2020-05-27
- 聚合类型与POD类型 2020-05-09
- C++基础 学习笔记六:复合类型之数组 2020-04-25
- C++基础 学习笔记五:重载之运算符重载 2020-04-23
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash