浅度复制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     }

 运行结果:

原文地址:https://www.cnblogs.com/shelly0307/p/7614365.html