对于引用类型的复制,通过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 }
运行结果:
时间: 2024-10-08 14:17:49