Создать локальную переменную по значению? - PullRequest
1 голос
/ 07 января 2010

Я вроде понимаю, почему это происходит, но не полностью. У меня есть базовый класс с переменной Shared (Static), объявленной так:

Public Shared myVar As New MyObject(arg1, arg2)

В методе производного класса я устанавливаю локальную переменную следующим образом:

Dim myLocalVar As MyObject = myVar

Теперь, когда я делаю что-то вроде myLocalVar.Property1 += value, значение в Property1 сохраняется до следующего вызова этого метода! Я полагаю, я получаю , почему это произойдет; myVar устанавливается по ссылке, а не по значению, но я никогда не встречал ничего подобного раньше. Есть ли способ (кроме моего обходного пути, который заключается в том, чтобы просто создать новый объект, используя значения свойств myVar), чтобы создать myLocalVar по значению ?

1 Ответ

3 голосов
/ 07 января 2010

Когда вы создаете myLocalVar, вы создаете новую ссылку на тот же общий объект. Если вы действительно хотите локальную копию общего экземпляра, вам нужно будет создать настоящую копию.

Это делается либо путем клонирования экземпляра, либо с помощью конструктора копирования того типа, который позволяет создавать копию экземпляра. Однако это не так просто, как кажется, потому что различия между глубоким и мелким копированием и клонированным или копируемым экземпляром могут создать аналогичные проблемы для вас, если свойство, к которому вы обращаетесь, является просто копией с мелким копированием того же экземпляра, который ссылка на свойство исходного экземпляра.

Лучшее, что я должен сделать в этом случае, - это создать локальную копию только тех частей общего экземпляра, которые вам нужны, а не копировать весь граф объектов. Это означает создание локальной копии любого типа Property1 и использование этого.

...