相對於淺拷貝,是指依照源對象為原型,創建一個新對象,將當前對象的所有字段進行執行逐位復制並支持遞歸,不管是是值類型還是引用類型,不管是靜態字段還是非靜態字段。
在C#中,我們們有三種方法實現深拷貝
實現ICloneable接口,自定義拷貝功能。
ICloneable 接口,支持克隆,即用與現有實例相同的值創建類的新實例。
ICloneable 接口包含一個成員 Clone,它用於支持除 MemberwiseClone 所提供的克隆之外的克隆。Clone 既可作為深層副本實現,也可作為淺表副本實現。在深層副本中,所有的對象都是重復的;而在淺表副本中,只有頂級對象是重復的,並且頂級以下的對象包含引用。 結果克隆必須與原始實例具有相同的類型或是原始實例的兼容類型。
代碼實現如下:
public class Person:ICloneable
{
public int Age { get; set; }
public string Address { get; set; }
public Name Name { get; set; }
public object Clone()
{
Person tem = new Person();
tem.Address = this.Address;
tem.Age = this.Age;
tem.Name = new Name(this.Name.FristName, this.Name.LastName);
return tem;
}
}
public class Name
{
public Name(string frisName, string lastName)
{
FristName = frisName;
LastName = lastName;
}
public string FristName { get; set; }
public string LastName { get; set; }
}
大家可以看到,Person類繼承了接口ICloneable並手動實現了其Clone方法,這是個簡單的類,試想一下,如果你的類有成千上萬個引用類型成員(當然太誇張,幾十個還是有的),這是不是份很恐怖的勞力活?