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