淺層複製

當我們有物件需要複製時可以透過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(映射)」的方式來達成。