2016-11-25 149 views
0

我創建了一個類我無法弄清楚克隆在C#

class MyClass:ICloneable 
{ 
    public int val; 
    public List<int> list; 
    public MyClass() 
    { 
     list = new List<int>(); 
    } 
    public object Clone() 
    { 
     return this.MemberwiseClone(); 
    } 
} 

和我運行下面的類

class ProgramTest 
{ 
    static void Main(string[] args) 
    { 
     MyClass objectA = new MyClass(); 
     objectA.list.Add(1); 
     MyClass objectB = (MyClass)objectA.Clone(); 
     objectA.val = 10; 
     objectB.val = 20; 
     objectB.list[0] = 20; 
     Console.WriteLine("objectA.val = {0}", objectA.val); 
     Console.WriteLine("objectA.list[0] = {0}", objectA.list[0]); 
     Console.WriteLine("objectB.val = {0}", objectB.val); 
     Console.WriteLine("objectB.list[0] = {0}", objectB.list[0]); 
     Console.ReadKey(); 
    } 
} 

輸出:

objectA.val = 10; 
objectA.list[0] = 20; 
objectB.val = 20; 
objectB.list[0] = 20; 

我的問題是: 我已經克隆了objectAobjectB,值類型(val)輸出如預期objectA有10和objectB有20.

但是對於引用類型如列表輸出不符合預期。我越來越objectA.list[0] 20和objectB.list[0]爲20。我期待objectA.list[0]爲1和objectB.list[0]爲20

有人可以請解釋爲什麼克隆沒有與名單的​​工作?

回答

0

從MSDN網站:

的MemberwiseClone方法創建一個新的 對象,然後複製當前對象的非靜態字段 新對象創建一個淺表副本。如果字段是值類型,則執行 字段的逐位副本。如果一個字段是一個引用類型,那麼引用是 複製但引用的對象不是;因此,原始對象 及其克隆涉及相同的對象

如果你想複製引用類型,你必須做一個深層克隆。看看這些:

How do you do a deep copy of an object in .NET (C# specifically)?

Deep cloning objects

+0

謝謝。現在我知道爲什麼克隆參考不起作用。 –

0

MemberwiseClone是一個淺拷貝(見https://msdn.microsoft.com/en-us/library/system.object.memberwiseclone(v=vs.110).aspx)。如預期的那樣,值類型在複製時保持值類型。因此,更改克隆對象的值不會更改原始值。引用類型不是這種情況。淺拷貝簡單地複製引用,所以改變克隆的對象也會改變原來的。你需要實現你自己的深層克隆者。你可以找到一個通用的解決方案或實現你自己的適用於每種對象類型。深層克隆將創建引用類型的新實例,而不是簡單地複製引用。

+0

謝謝。現在我知道爲什麼克隆參考不起作用。 –