Variável Instantiate local por valor?
Pergunta
Eu meio que entender por que isso está acontecendo, mas não inteiramente. Eu tenho uma classe base com um (Shared
) variável Static
, declarou assim:
Public Shared myVar As New MyObject(arg1, arg2)
Em um método de uma classe derivada, eu definir uma variável local assim:
Dim myLocalVar As MyObject = myVar
Agora, quando eu faço algo como myLocalVar.Property1 += value
, o valor em persistir Property1
para a próxima chamada desse método! Suponho que eu recebo por que estaria acontecendo; myVar
está sendo definido por referência e não por valor, mas eu nunca encontrei nada parecido antes. Existe alguma maneira (que não seja a minha solução, que é apenas para criar um novo objeto usando os valores de propriedade de myVar
) para criar myLocalVar
por valor ?
Solução
Quando você cria myLocalVar
você está criando uma nova referência para o mesmo objeto compartilhado. Se você realmente quer uma cópia local da instância compartilhada você terá de criar uma cópia fiel.
Isso é feito por qualquer clonagem a instância ou com um construtor de cópia do tipo que permite que você crie uma cópia da instância. Isto não é tão simples quanto parece, no entanto, devido às diferenças entre rasas e profundas cópia e uma instância clonado ou copiado poderia criar problemas semelhantes para você se a propriedade que você está acessando é simplesmente uma referência copiado-rasa para a mesma instância que a propriedade na instância original é referência.
A melhor coisa que fazer neste caso é criar uma cópia local somente as partes da instância compartilhada que você precisa, em vez de copiar todo o gráfico do objeto. Isto significa criar uma cópia local de qualquer Property1
tipo é e usando isso.