2011-04-24 65 views
0

我有一個班級說classA與字符串數組。在我的代碼中,我將ClassA作爲一個對象,然後我想創建另一個新的ClassA對象,但它應該將原始對象複製到新類中,並執行它應該執行的任何操作。C#的新對象,而不是複製一個對象,但引用?

但奇怪的是,當我聲明新對象時,新對象中的任何變化都會影響原始對象。

爲什麼我會得到這樣的行爲是否有任何理由?

+2

用你正在使用的代碼編輯你的問題(幷包括你的'ClassA'定義的相關部分)。 – 2011-04-24 21:34:06

+3

@邁克爾說,我們不能確定沒有一些代碼,但你可能做的是淺拷貝而不是深拷貝。谷歌這些條款,如果你從來沒有聽說過他們。 – slezica 2011-04-24 21:35:13

+0

請張貼一些代碼。沒有它,這是一個猜謎遊戲。 – spender 2011-04-24 21:35:56

回答

2

這聽起來像你只是這樣做是爲了複製:

ClassA obj2 = obj1; 

在這種情況下,然後因爲你正在使用的對象僅用於指向更改爲obj2的確會反映在obj1內存堆中的相同位置。你實際上並沒有複製它,你只是再引用它。

看看ICloneable接口here。你會想是這樣的:

public class ClassA : ICloneable 
{ 
    public string myString { get; set; } 
    public object Clone() 
    { 
     var obj = new ClassA(); 
     obj.myString = myString; 
     return myObj; 
    } 
} 

那麼你還是這樣稱呼它:

ClassA obj2 = (ClassA)obj1.Clone(); 

請記住,這是不是很類型安全的,但是。演員陣容有點混亂(說實話,我還沒有嘗試過,所以它可能會有問題)。我不認爲。NET還引入了一個通用的ICloneable。但寫一個不應該太難。喜歡的東西:

public interface ICloneable<T> 
{ 
    public T Clone(); 
} 
public class ClassA : ICloneable<ClassA> 
{ 
    public string myString { get; set; } 
    public ClassA Clone() 
    { 
     var obj = new ClassA(); 
     obj.myString = myString; 
     return myObj; 
    } 
} 

這應該是可調用這樣的:

ClassA obj2 = obj1.Clone<ClassA>(); 
(至少稍加調整)

甚至可能是:

ClassA obj2 = obj1.Clone(); 

一個額外的好處,以使通用像這樣的接口是,任何給定的類都可以對其他類型「可複製」,而不僅僅是它本身。您可以在單個類上實現儘可能多的接口。所以,你可以有類似:

SomeOtherClass obj3 = obj1.Clone<SomeOtherClass>(); 

這一切都是從我的頭頂,我沒有編譯器方便的測試,但你的想法。

0

看來您指定的第一個對象,以第二..

要複製你要的所有屬性值分配給新的對象的存在的對象,而不是分配整個對象,因爲此你可以創建另一個對同一個對象的引用。

要創建的ClassA第一實例的副本,請嘗試以下操作:

ClassA = secondObject = new ClassA(); 
secondObject.Property1 = firstObject.Property1; 
secondObject.Property2 = firstObject.Property2; 
............ 
2

我敢肯定,這是因爲你只設置另一個參考新對象的一個​​字符串數組。如果你想要一個單獨的字符串數組,你需要創建一個構造函數來創建一個新的字符串數組並複製字符串。

2

您可以構造一個構造函數重載,它接受一個新的ClassA對象並複製它的參數。

public class ClassA 
{ 
    public String SomeParam { get; set; } 
    public ClassA(ClassA myoldobject) 
    { 
      //Logic for initializing new object. 
      this.SomeParam = myoldobject.SomeParam; 
    } 
    public ClassA(String someparam) 
    { 
      this.SomeParam = someparam; 
    } 
} 

這使您可以說

ClassA one = new ClassA("Test"); 
ClassA two = new ClassA(one); 
1

這是因爲 - 是引用類型和你試圖獲得類型的行爲。看更深的解釋here。 CLR通過J. Richter的C#書對它進行了很好的解釋。

如果你想複製一個參考類型,您可能需要實現一個IClonable接口並調用克隆了點。

相關問題