参照したいオブジェクトがコピーされている場所、またはコピーしたいオブジェクトが参照されている場所で、同じ問題が何度も発生します。これは、= 演算子を使用したときに発生します。
たとえば、オブジェクトを別のフォームに送信している場合、つまり:
SomeForm myForm = new SomeForm();
SomeObject myObject = new SomeObject();
myForm.formObject = myObject;
...そしてフォーム内のオブジェクトを変更しても、元のオブジェクトは変更されません。オブジェクトがコピーされ、参照されていないかのようです。しかし、私がこれを行うとき:
SomeObject myObject = new SomeObject();
SomeObject anotherObject = new SomeObject();
anotherObject = myObject;
...そして変更しanotherObject
、myObject
同様に変更されます。
最も厄介なケースは、定義済みのオブジェクトの 1 つを複製しようとする場合です。
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
は、上記の clone メソッドの場合を除いて、常にコピーされているようです。
私の質問は、関数でのキーワードの使用を考慮せずにref
、オブジェクトがいつコピーされ、いつオブジェクトが参照されるのかということです (つまり、関数に渡すとき、他のオブジェクトとして設定するとき) (上記の最初の 2 つの例)、3 番目の例のようにメンバー変数をコピーする場合など)?