淺層複製
當我們有物件需要複製時可以透過Object.MemberwiseClone()的方法來達成, 該方法屬於淺層複製,這樣會有什麼問題嗎? 若複製的物件中有ValueType的屬性,其欄位時將會複製該欄位, 但是有複製ReferenceType的屬性,其欄位時只會複製到其參考 (ValueType、ReferenceType點我)
以下擷取官方提供之相關程式碼:
public class Person
{
public int Age;
public string Name;
public IdInfo IdInfo;
public Person ShallowCopy()
{
return (Person) this.MemberwiseClone();
}
}
若想要避免上述的複製問題,就要考慮到使用深層複製。
深層複製
深層複製就是完整Clone一個物件,並不會只有複製到參考的問題。
以下擷取官方提供之相關程式碼:
public class Person
{
public int Age;
public string Name;
public IdInfo IdInfo;
public Person DeepCopy()
{
Person other = (Person) this.MemberwiseClone();
other.IdInfo = new IdInfo(IdInfo.IdNumber);
other.Name = String.Copy(Name);
return other;
}
}
官方也提到可用「Serialize(序列化)」或「Reflection(映射)」的方式來達成。