newObj := TMyObject.Create;
newObj.Assign(oldObj);
Supponendo che Assign
corretta applicazione, questo
- crea una nuova istanza di
TMyObject
(via Create
)
- memorizza un riferimento a tale istanza nella variabile
newObj
(tramite l'opera tor)
- Esegue una copia profonda di
oldObj
, rendendo newObj
una copia funzionalmente esatta di oldObj
(via Assign
).
Il risultato finale qui è che ci sono due istanze completamente separate di TMyObject
che sono, a questo punto, copie esatte l'una dell'altra.
newObj := oldObj;
I copia semplicemente sopra un riferimento per oldObj
e lo memorizza nella variabile newObj
. In questo caso hai ancora solo un'istanza di TMyObject
e entrambe le variabili newObj
e oldObj
puntano alla stessa istanza. Se modifichi lo stato di quell'oggetto utilizzando una variabile, entrambi rifletteranno tali cambiamenti poiché entrambi puntano allo stesso oggetto sottostante.
Questo è in contrasto con l'esempio precedente in cui si dispone di due oggetti separati il cui stato può divergere in quanto entrambi gli oggetti vengono modificati in modo indipendente.
Concettualmente, le variabili di oggetti (classi) sono generalmente chiamati "tipi di riferimento". Le variabili di questo tipo sono essenzialmente solo puntatori (se questo è più familiare). L'assegnazione (:=
) con tipi di riferimento copia solo il riferimento all'oggetto, non l'oggetto stesso.
L'unica eccezione sostanziale a questo sono i tipi string
, che hanno molte proprietà dei tipi di riferimento, ma sono gestiti dal compilatore per comportarsi in molti modi anche come tipi di valore (la modifica di una stringa produce una nuova copia modificata invece di modificare il stringa originale a cui è possibile fare riferimento altrove).
Vedi anche: To copy from one object to another, can I assign the variables directly, or must I assign their properties individually?
fonte
2015-12-27 14:53:15
noti che TObject non ha un metodo Assegna, solo TPersistent fa.E la descrizione di TPersistent.Assign parla di oggetti "simili". Documenti e contratti sono un po 'confusi qui. – mjn