Создать экземпляр локальной переменной по значению?
Вопрос
Я вроде понимаю, почему так происходит, но не совсем.У меня есть базовый класс с Shared
(Static
) переменная, объявленная так:
Public Shared myVar As New MyObject(arg1, arg2)
В методе производного класса я установил локальную переменную следующим образом:
Dim myLocalVar As MyObject = myVar
Теперь, когда я делаю что-то вроде myLocalVar.Property1 += value
, значение в Property1
сохраняется до следующего вызова этого метода!полагаю, я получу почему это произойдет; myVar
устанавливается по ссылке, а не по значению, но я никогда раньше не сталкивался с чем-то подобным.Есть ли какой-нибудь способ (кроме моего обходного пути, который заключается в том, чтобы просто создать новый объект, используя значения свойств myVar
) создавать myLocalVar
по стоимости?
Решение
Когда вы создаете myLocalVar
вы создаете новую ссылку на тот же общий объект.Если вам действительно нужна локальная копия общего экземпляра, вам необходимо создать настоящую копию.
Это делается либо путем клонирования экземпляра, либо с помощью конструктора копирования типа, который позволяет создать копию экземпляра.Однако это не так просто, как кажется, из-за различий между глубоким и поверхностным копированием, и клонированный или скопированный экземпляр может создать для вас аналогичные проблемы, если свойство, к которому вы обращаетесь, представляет собой просто поверхностно скопированную ссылку на тот же экземпляр, который ссылается на свойство исходного экземпляра.
Лучшее, что я могу сделать в этом случае, — это создать локальную копию только тех частей общего экземпляра, которые вам нужны, а не копировать весь граф объекта.Это означает создание локальной копии любого типа. Property1
есть и использует это.