MemberwiseClone 关于 string 浅拷贝的一个误解

  1. static void Main(string[] args)  
  2. {  
  3.   
  4.     var cls1 = new MyClass { MyInt = 111, MyStr = "这是111", OtherClass = new MyClassOther { MyInt = 111111, MyStr = "这是111111" } };  
  5.   
  6.     //Clone后:  
  7.     //cls1.MyStr与cls2.MyStr都是指向了"这是111"的reference而不是instance  
  8.     //也可以这么理解:"这是111"是放在一个表里且有个ID;cls1与cls2是另一个表的两条记录,这两条记录的字段MyStr里存放的都是"这是111"的ID。  
  9.     //cls1.OtherClass与cls2.OtherClass同理是指向了相关对象的reference而不是instance  
  10.     var cls2 = cls1.Clone() as MyClass;  
  11.   
  12.   
  13.     //此操作对cls1.MyStr没有任何影响,只是将cls2.MyStr的reference变为了"这是222"的reference  
  14.     //所以改动后:cls1.MyStr != cls2.MyStr  
  15.     cls2.MyStr = "这是222";  
  16.   
  17.     //此操作跟上面有些不一样,因为cls2.OtherClass与cls1.OtherClass都是指向同一个reference,此reference没有变,对reference的instance任何改动,  
  18.     //所以改动后,cls1.OtherClass.MyStr == cls2.OtherClass.MyStr   cls1.OtherClass.MyInt == cls2.OtherClass.MyInt  
  19.     cls2.OtherClass.MyStr = "这是444444";  
  20.     cls2.OtherClass.MyInt =444444;  
  21.   
  22. }  
  23.   
  24. class MyClass : ICloneable  
  25. {  
  26.     public int MyInt { get; set; }  
  27.     public string MyStr { get; set; }  
  28.     public object Clone()  
  29.     {  
  30.         return this.MemberwiseClone();  
  31.     }  
  32.     public MyClassOther OtherClass { get; set; }  
  33. }  
  34.   
  35. class MyClassOther  
  36. {  
  37.     public int MyInt { get; set; }  
  38.     public string MyStr { get; set; }  
  39. }  

原文地址:https://www.cnblogs.com/shihao/p/2617173.html