我不斷收到相同的問題,我想要引用的對象被複制或者我想要複製的對象被引用。當我使用=運算符時會發生這種情況。什麼時候複製了C#值/對象,何時複製了其引用?
例如,如果我發送對象爲另一種形式,即:
SomeForm myForm = new SomeForm();
SomeObject myObject = new SomeObject();
myForm.formObject = myObject;
...然後修改表單對象,原來的對象不會被修改。就好像該對象被複制並且未被引用。然而,當我這樣做:
SomeObject myObject = new SomeObject();
SomeObject anotherObject = new SomeObject();
anotherObject = myObject;
...然後修改anotherObject
,myObject
被修改爲好。
最惱人的情況是,當我試圖克隆我定義的對象之一:
public class SomeObject
{
double value1, value2;
//default constructor here
public SomeObject(val1, val2)
{
value1 = val1;
value2 = val2;
}
public void Clone(SomeObject thingToCopy)
{
this.value1 = thingToCopy.value1;
this.value2 = thingToCopy.value2;
}
}
當我這樣做......
SomeObject obj1 = new SomeObject(1, 2);
SomeObject obj2 = new SomeObject();
obj2.Clone(obj1);
... obj1
引用和任何修改到obj2
更改obj1
。
系統對象如int, double, string
等似乎總是被複制,除了上面的克隆方法。
我的問題是,沒有考慮到ref
關鍵字在函數中的使用,什麼時候一個對象被拷貝以及什麼時候一個對象在每個事件中被引用(即當傳遞給函數,當設置爲其他對象(如上面的前兩個例子),複製類似第三個例子的成員變量等)?
對不起,挑選這裏。對象不派生。類型可以。對象通常是用於描述類型實例的術語。 – 2010-12-03 17:07:25
您可以使用`ref`通過*參數傳遞參數*,但這與將*作爲參考傳遞*不同。我認爲這是值得區分兩者之間的。 – 2010-12-03 17:14:59