簡單來介紹一下C#深淺拷貝問題
淺拷貝:復制其另一個對象的引用(在堆中使用的是同一個對象的引用);
深拷貝:而逐一復制被復制對象的數據成員的方式稱為深復制(在堆中創建新的一塊內存空間,使用的不是同一個對象的引用)
創建一個Person類:
public class Person { public int Id { get; set; } //值類型 public string Name { get; set; } //引用類型 public int Age { get; set; } }
淺拷貝(復制):p2改變,p1也跟着改變,使用的同一個引用對象persion
class Program { static void Main(string[] args) { //初始化一個persion實例 Person p1 = new Person { Id = 1, Name = "張三", Age = 20 }; Person p2 = p1; //淺拷貝 p2.Id = 2; p2.Name = "李四"; Console.WriteLine($"p1的編號{p1.Id},p1的名字{p1.Name}; p2的編號{p2.Id},p2的名字{p2.Name}" ); } }
輸出:
深拷貝(復制):
C#中Object類提供了一個MemberwiseClone方法實現的就是上述機制。
MemberwiseClone(): 創建當前對象的淺拷貝(用來實現淺拷貝的);
實現深拷貝C# 提供一個ICloneable接口,實現Clone方法來實現深拷貝
public class Person:ICloneable { public int Id { get; set; } //值類型 public string Name { get; set; } //引用類型 public int Age { get; set; } public object Clone() { Person person = (Person)this.MemberwiseClone(); //創建當前對象的淺拷貝。 return person; } }
class Program { static void Main(string[] args) { //初始化一個persion實例 Person p1 = new Person { Id = 1, Name = "張三", Age = 20 }; Person p2 = p1; //淺拷貝 p2.Id = 2; p2.Name = "李四"; Person p3 = (Person)p1.Clone(); //深拷貝 p3.Id = 3; p3.Name = "王五"; Console.WriteLine($"p1的編號{p1.Id},p1的名字{p1.Name}; p2的編號{p2.Id},p2的名字{p2.Name}; p3的編號{p3.Id},p3的名字{p3.Name}" ); } }
輸出:
實現深拷貝的方式還有以下幾種:
1.創建一個新的對象,把屬性值賦值給新對象的屬性值,例如再添加一個Student的類,同時創建Persion實例和Student實例,把presion的name屬性賦值給student的name,再改變student的name值(和上面方法的原理是一樣的:都是兩個實例);
2.反射
3.表達式目錄樹
4.序列化
就到這里,其他幾種我就不再實現,有時間再一一實現。