關於值類型和引用類型: 淺度複製(shallow copy)只複製值類型(char,int )的值,而對於引用類型不會複製,淺度複製可以通過派生於System.Object的MemberwiseClone()方法來完成,這是一個受保護的方法。因為他並沒有考慮引用類型成員,因此新對象的引用成員就會指向 ...
關於值類型和引用類型:
淺度複製(shallow copy)只複製值類型(char,int )的值,而對於引用類型不會複製,淺度複製可以通過派生於System.Object的MemberwiseClone()方法來完成,這是一個受保護的方法。因為他並沒有考慮引用類型成員,因此新對象的引用成員就會指向源對象中的相同成員引用的對象
如果要創建成員的新實例(複製值,而不是複製引用)就需要用到深度複製(deep copy)
深度複製需要實現一個ICloneable介面,如果使用這個介面需要實現它包含的Clone()方法,這個方法返回一個System.Object的值,
下麵看下淺度複製:
1 public class Company 2 { 3 public string value { get; set; } 4 } 5 6 public class Phone 7 { 8 public string color { get; set; } 9 10 public Company company = new Company(); 11 12 public Phone (string newCompany) 13 { 14 company.value = newCompany; 15 } 16 17 public object getCopy() 18 { 19 return MemberwiseClone(); 20 } 21 }
1 static void Main(string[] args) 2 { 3 Phone phone = new Phone("xiaomi"); 4 phone.color = "red"; 5 Phone phone1 = (Phone)phone.getCopy(); 6 Console.WriteLine($"phone company:{phone.company.value} color: {phone.color}"); 7 Console.WriteLine($"phone1 company:{phone1.company.value} color: {phone1.color}"); 8 9 Console.WriteLine("淺度複製修改新對象的值"); 10 11 phone1.company.value = "huawei"; 12 phone1.color = "green"; 13 Console.WriteLine($"phone company:{phone.company.value} color: {phone.color}"); 14 Console.WriteLine($"phone1 company:{phone1.company.value} color: {phone1.color}"); 15 Console.ReadKey(); 16 17 }
實驗現象:
淺度複製在後引用類型修改後,原對象也跟著發生了改變
修改這個問題,可以使用深度複製
1 public class Company 2 { 3 public string value { get; set; } 4 } 5 6 public class Phone:ICloneable 7 { 8 public string color { get; set; } 9 10 public Company company = new Company(); 11 12 public Phone (string newCompany) 13 { 14 company.value = newCompany; 15 } 16 17 public object getCopy() 18 { 19 return MemberwiseClone(); 20 } 21 22 public object Clone() 23 { 24 Phone newPhone = new Phone(company.value); 25 return newPhone; 26 //newPhone.company.value = this.company.value; 27 28 } 29 }
1 static void Main(string[] args) 2 { 3 Phone phone = new Phone("xiaomi"); 4 phone.color = "red"; 5 Phone phone1 = (Phone)phone.Clone(); 6 Console.WriteLine($"phone company:{phone.company.value} color: {phone.color}"); 7 Console.WriteLine($"phone1 company:{phone1.company.value} color: {phone1.color}"); 8 9 Console.WriteLine("淺度複製修改新對象的值"); 10 11 phone1.company.value = "huawei"; 12 phone1.color = "green"; 13 Console.WriteLine($"phone company:{phone.company.value} color: {phone.color}"); 14 Console.WriteLine($"phone1 company:{phone1.company.value} color: {phone1.color}"); 15 Console.ReadKey(); 16 17 }
實驗現象