2014-06-19 239 views
0

我有這樣一個類:創建一個新的類實例

Public Class Dog{ 
    public Dog(string name, int age){ 
     Name = name; 
     Age = age; 
    } 

    public string Name { get; set; } 
    public int Age { get; set; } 
} 

然後,我創建這個類

Dog jake = new Dog("Jake", 3); 

的一個實例,當我試圖複製類和改變像

Dog buster = jake; 
buster.Name = "Buster"; 

它的屬性我這樣做的時候,傑克的名稱將改變過

我該如何避免這種情況?

請注意,我正在使用的類包含如此多的屬性,如果我可以複製類並更改我想要的一個屬性,它將使我更容易。

+7

看到這裏http://stackoverflow.com/questions/78536/deep-cloning-objects。現在,您只是將*引用*複製到對象,這就是爲什麼更改該對象的屬性同時改變兩個對象的原因。他們指的是同一個對象。 –

+0

在C++中拷貝一個變量。不在C#http://www.albahari.com/valuevsreftypes.aspx –

回答

5

這會發生,因爲內存在C#中的工作方式。每個類對象實際上都是一個指向內存中的對象的指針 - 當您將一個變量分配給另一個變量時,您仍然使用相同的指針,並因此在對一個對象進行更改時修改相同的數據。從技術上講,如果你製作了所有的對象結構體,它們就會很好地複製,因爲結構體是值類型,因此可以傳遞副本。然而,這是非常不明智的,因爲它限制了用法,特別是對於多態性,並且對於具有許多成員的對象的內存管理來說是一個壞主意。

解決此問題的最佳方法是在類Dog上實現一個函數,該函數允許您將數據複製到新的Dog對象中。因此,您可以撥打

Dog buster = jake.Clone(); 
buster.Name = "Buster"; 

並在克隆中,將當前Dog對象的所有屬性複製到新的Dog對象中。

編輯:回到C++根,實現一個「複製構造函數」,它採用相同類型的參數並進行深度複製也很常見。 IE

Dog jake = new Dog() { Name = "Jake" }; 
Dog buster = new Dog(jake) { Name = "Buster" }; 

注:上述語法使用大括號,它允許您在創建類時立即設置類中的屬性和字段。雖然技術上編譯器糖,它非常善於使實例化調用更簡潔

0

當你做狗巴士=傑克。你創建一個指向jake的變量

所以,當你做buster.name = buster時,你在技術上會改變jakes的名字。

+0

我忽略了另一行。 – MGHandy

相關問題