Creare un'istanza variabile locale per valore?
Domanda
I sorta di capire perché questo sta accadendo, ma non del tutto. Ho una classe di base con una variabile Shared
(Static
), ha dichiarato in questo modo:
Public Shared myVar As New MyObject(arg1, arg2)
In un metodo di una classe derivata, ho impostato una variabile locale in questo modo:
Dim myLocalVar As MyObject = myVar
Ora, quando faccio qualcosa di simile myLocalVar.Property1 += value
, il valore in Property1
persiste per la prossima chiamata di questo metodo! Suppongo che ho perché che sarebbe successo; myVar
è fissata in riferimento invece che per valore, ma non ho mai incontrato nulla di simile prima. C'è un modo (altro che il mio soluzione alternativa, che è quello di creare solo un nuovo oggetto utilizzando i valori di proprietà di myVar
) per creare myLocalVar
per valore
Soluzione
Quando si crea myLocalVar
si sta creando un nuovo riferimento allo stesso oggetto condiviso. Se veramente si vuole una copia locale del istanza condivisa è necessario creare una copia.
Questo è fatto o clonando l'istanza o con un costruttore di copia del tipo che consente di creare una copia dell'istanza. Questo non è così semplice come sembra, tuttavia, a causa delle differenze tra la copia profonda e superficiale e un'istanza clonata o copiata potrebbe creare problemi simili per voi, se la proprietà si sta accedendo è semplicemente un riferimento poco profonde copiato nella stessa istanza che la proprietà nell'istanza originale fa riferimento.
La cosa migliore che ho da fare in questo caso è quello di creare una copia locale solo le parti della istanza condivisa che è necessario, piuttosto che copiare l'intero grafo di oggetti. Ciò significa creare una copia locale di qualsiasi tipo è Property1
e l'utilizzo di questo.