.NET中深复制与浅复制
来源:互联网 发布:自制4g网络信号增强器 编辑:程序博客网 时间:2024/05/27 14:12
概述:
在.NET里面,提供对象复制的功能,前提是实现ICloneable接口。ICloneable接口中有一个Clone方法,
可以在类中覆写实现自定义的复制方法。对象复制的实现方法有两种:深复制和浅复制。
深复制:指源对象与复制对象互相独立,为新对象重新分配了一段内存空间,并复制源对象的内容。其中任何一个对象的改动都不会对另外一个对象造成影响。
如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。对象复制的实现方法有两种:浅复制和浅复制。
C#中有两种类型变量,一种 是值类型变量,一种是引用类型变量(类,接口,数组)。对于前者,复制是属于深复制;而对于后者,一般的复制只是浅复制,相当于只传递一个引用指针一样。因此 对于后者进行真正深复制的时候,也是最费事的,具体的说,必须为其实现ICloneable接口中提供的Clone方法。
在.NET里面,提供对象复制的功能,前提是实现ICloneable接口。ICloneable接口中有一个Clone方法,
可以在类中覆写实现自定义的复制方法。对象复制的实现方法有两种:深复制和浅复制。
深复制和浅复制:
浅复制,浅复制是指源对象与复制出来的对象共用一份实体,对其中任何一个对象的改动都会影响另外一个对象。相当于复制了指针。深复制:指源对象与复制对象互相独立,为新对象重新分配了一段内存空间,并复制源对象的内容。其中任何一个对象的改动都不会对另外一个对象造成影响。
深浅复制与数据类型:
MemberwiseClone 方法创建当前对象的浅表副本,方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。对象复制的实现方法有两种:浅复制和浅复制。
C#中有两种类型变量,一种 是值类型变量,一种是引用类型变量(类,接口,数组)。对于前者,复制是属于深复制;而对于后者,一般的复制只是浅复制,相当于只传递一个引用指针一样。因此 对于后者进行真正深复制的时候,也是最费事的,具体的说,必须为其实现ICloneable接口中提供的Clone方法。
图解:
代码说明:C#中的数组是引用型的变量,通过对数组的复制的演示。理解深浅复制。
浅复制:
<span style="font-size:14px;">public class ShallowCopy : ICloneable { public int[] s = { 1,2,3,4 }; public Object Clone() { return this.MemberwiseClone(); } public void Display() { foreach (int i in s) { Console.Write(i + ","); } Console.WriteLine(); } }</span>客户端:(1)
客户端:(2)
通过obj1.s[1]=1和obj2.s[2]=1,我们可以看出,浅复制只要任意一个实例化的对象对引用的对象进行修改,都以最后一次的修改为准。
深复制:
<span style="font-size:14px;"> public class DeepCopy : ICloneable { public int[] s = { 1, 2, 3, 4}; public DeepCopy() { } private DeepCopy(int[] s) { this.s = (int[])s.Clone(); } public Object Clone() { // 构造一个新的DeepCopy对象 return new DeepCopy(this.s); } public void Display() { foreach (int i in s) { Console.Write(i + ", "); } Console.WriteLine(); } }}</span>客户端:
深复制实例化的对象如果进行修改如obj1.s[1]=1只是对对象obj1进行了修改,并不影响obj2。
总结:复制功能实现从一个对象在创建另一个可制定的对象,而不需要知道任何创建的细节,我们所学的原型模式就是复制功能的体现。
1 0
- .NET中深复制与浅复制
- .NET深复制与浅复制
- JAVA中浅复制与深复制
- JAVA中浅复制与深复制
- JAVA中浅复制与深复制
- JAVA中浅复制与深复制
- JAVA中浅复制与深复制
- JAVA中浅复制与深复制
- JAVA中浅复制与深复制
- JAVA中浅复制与深复制
- JAVA中浅复制与深复制
- JAVA中浅复制与深复制
- JAVA中浅复制与深复制
- JAVA中浅复制与深复制
- JAVA中浅复制与深复制
- JAVA中浅复制与深复制
- JAVA中浅复制与深复制
- JAVA中浅复制与深复制
- 校招【 笔试面试 】准备之C语言 基础知识一
- Java提高篇(三六)-----java集合细节(二):asList的缺陷
- hadoop分布式部署系列3:YARN
- hdu1685
- ReportStudio入门教程(七十七) - 自定义排名规则
- .NET中深复制与浅复制
- 用宏定义,不用?:和比较switch等求两个数中较大的数
- Linux下C/C++程序调试基础(GCC,G++,GDB,CGDB,DDD)
- 模拟解hdu1283 最简单的计算机
- TCP/IP SOCKET HTTP及HTTPS之间的关系及各自特性之总结
- Opencascade学习
- MTK面试归来
- HDOJ 题目1084 钱币兑换问题(母函数,打表)
- 树链剖分-链的剖分(线段树维护边权值的更新)