浅度复制VS深度复制

Posted shelly双鱼座

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅度复制VS深度复制相关的知识,希望对你有一定的参考价值。

对于引用类型的复制,通过MemberwiseClone()复制的只是引用,即myclone1和myclone2的myContent是相同的对象实例。一个改变值,另一个也会改变。因为myContent.Val是公共字段。

值对象则没有这种顾虑

PS:感觉ICloneable 接口并没有什么用,完全可以自己写方法。毕竟ICloneable里面只有一个Clone方法。

代码如下:

 1    class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Cloner myclone1 = new Cloner(5);
 6 
 7             // 浅度复制
 8             Cloner myclone2 = (Cloner)myclone1.GetCopy();
 9             Console.WriteLine("myclone2.myContent.Val:" + myclone2.myContent.Val);
10             myclone1.myContent.Val = 10; // 修改了myclone1,myclone2也会变
11             Console.WriteLine("myclone2.myContent.Val:" + myclone2.myContent.Val);
12 
13             // 深度复制
14             Cloner myclone3 = (Cloner)myclone1.DeepClone();
15             Console.WriteLine("myclone3.myContent.Val:"+myclone3.myContent.Val);
16             myclone1.myContent.Val = 15; // 修改了myclone1,myclone2不会变
17             Console.WriteLine("myclone3.myContent.Val:" + myclone3.myContent.Val);
18 
19             Console.ReadKey();
20         }
21     }
22 
23     public class Content
24     {
25         public int Val;
26     }
27 
28     public class Cloner //:ICloneable
29     {
30         public Content myContent = new Content();// 引用类型才行,值类型不行
31 
32         public Cloner(int newVal)
33         {
34             myContent.Val = newVal;
35         }
36 
37         public object GetCopy() // 浅度复制
38         {
39             return MemberwiseClone();// 创建浅表副本
40         }
41 
42         public object DeepClone() // 深度复制
43         {
44             Cloner clonedCloner = new Cloner(myContent.Val);
45             return clonedCloner;
46         }
47     }

 运行结果:

 

以上是关于浅度复制VS深度复制的主要内容,如果未能解决你的问题,请参考以下文章

转载---Java集合对象的深度复制与普通复制

c#如何把一list<> 复制到 另一个list<>

谈谈js中深度克隆和浅度克隆

Clone的理解

System.arraycopy()的分析

js浅度克隆/深度克隆