我有一個班級說classA與字符串數組。在我的代碼中,我將ClassA作爲一個對象,然後我想創建另一個新的ClassA對象,但它應該將原始對象複製到新類中,並執行它應該執行的任何操作。C#的新對象,而不是複製一個對象,但引用?
但奇怪的是,當我聲明新對象時,新對象中的任何變化都會影響原始對象。
爲什麼我會得到這樣的行爲是否有任何理由?
我有一個班級說classA與字符串數組。在我的代碼中,我將ClassA作爲一個對象,然後我想創建另一個新的ClassA對象,但它應該將原始對象複製到新類中,並執行它應該執行的任何操作。C#的新對象,而不是複製一個對象,但引用?
但奇怪的是,當我聲明新對象時,新對象中的任何變化都會影響原始對象。
爲什麼我會得到這樣的行爲是否有任何理由?
這聽起來像你只是這樣做是爲了複製:
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>();
這一切都是從我的頭頂,我沒有編譯器方便的測試,但你的想法。
看來您指定的第一個對象,以第二..
要複製你要的所有屬性值分配給新的對象的存在的對象,而不是分配整個對象,因爲此你可以創建另一個對同一個對象的引用。
要創建的ClassA
第一實例的副本,請嘗試以下操作:
ClassA = secondObject = new ClassA();
secondObject.Property1 = firstObject.Property1;
secondObject.Property2 = firstObject.Property2;
............
我敢肯定,這是因爲你只設置另一個參考新對象的一個字符串數組。如果你想要一個單獨的字符串數組,你需要創建一個構造函數來創建一個新的字符串數組並複製字符串。
您可以構造一個構造函數重載,它接受一個新的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);
用你正在使用的代碼編輯你的問題(幷包括你的'ClassA'定義的相關部分)。 – 2011-04-24 21:34:06
@邁克爾說,我們不能確定沒有一些代碼,但你可能做的是淺拷貝而不是深拷貝。谷歌這些條款,如果你從來沒有聽說過他們。 – slezica 2011-04-24 21:35:13
請張貼一些代碼。沒有它,這是一個猜謎遊戲。 – spender 2011-04-24 21:35:56