Я постоянно повторяю одну и ту же проблему, когда копируется объект, который я хочу ссылаться, или где ссылается объект, который я хочу скопировать. Это происходит, когда я использую оператор =.
Например, если я отправляю объект в другую форму, то есть:
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
в функциях, когда объект копируется и когда объект получает ссылку в каждом случае вопроса (т.е. при переходе к функциям при настройке как и другие объекты (например, первые два приведенных выше примера), при копировании переменных-членов, таких как третий пример и т.д.)?