我一遍又一遍地遇到相同的问题,即我想引用的对象被复制,或者我想复制的对象被引用。这发生在我使用=运算符时。
例如,如果我要将该对象发送到另一个窗体:
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
关键字的情况下,每种情况下对象何时被复制,何时被引用(例如,传递给函数时,设置为其他对象时(如前两个示例),复制成员变量时等)?