Sommario:
Definizione - Cosa significa Deep Copy?
Deep copy, in C #, si riferisce a una tecnica mediante la quale viene creata una copia di un oggetto in modo tale da contenere copie di entrambi i membri dell'istanza e degli oggetti a cui fanno riferimento i membri di riferimento.
Deep copia ha lo scopo di copiare tutti gli elementi di un oggetto, inclusi gli elementi a riferimento diretto (di tipo valore) e gli elementi a riferimento indiretto di un tipo di riferimento che contiene un riferimento (puntatore) in una posizione di memoria che contiene dati anziché contenere il dati stessi. La copia profonda viene utilizzata negli scenari in cui viene creata una nuova copia (clone) senza alcun riferimento ai dati originali.
Techopedia spiega Deep Copy
La copia profonda differisce dalla copia ridotta nel modo in cui vengono copiati i membri del tipo di riferimento dell'oggetto. Durante la copia dei membri del campo di tipo valore in entrambi i casi, viene eseguita una copia del campo bit per bit. Quando si copiano campi di tipo di riferimento, la copia superficiale comporta la copia solo del riferimento, mentre nella copia profonda viene eseguita una nuova copia dell'oggetto indicato.
La copia profonda può essere illustrata con un esempio considerando un oggetto Employee con AddressInfo come membro del tipo di riferimento insieme ad altri membri del tipo di valore. Una copia profonda di Employee crea un nuovo oggetto, Employee2, con membri di tipo valore pari a Employee ma fa riferimento a un nuovo oggetto, AddressInfo2, che è una copia di AddressInfo.
La copia profonda può essere implementata utilizzando uno dei seguenti metodi:
- Il costruttore della copia della classe può essere implementato con la logica necessaria per copiare i membri di entrambi i tipi di valore e di riferimento (dopo un'adeguata allocazione della memoria). Questo metodo è noioso e soggetto a errori.
- Il metodo System.Object.MemberwiseClone può essere utilizzato per copiare i membri non statici di tipo valore. Copie di oggetti di tipo di riferimento possono essere create e assegnate con lo stesso set di valori dell'originale
- Un oggetto che deve essere copiato in profondità può essere serializzato e deserializzato in un nuovo oggetto ripristinandolo. Questo metodo è automatizzato e non richiede modifiche al codice per le modifiche nei membri dell'oggetto, ma è più lento di altri metodi e richiede che l'oggetto clonato sia serializzabile
- La riflessione con ricorsione può essere utilizzata per ottenere una copia superficiale, a quel punto è possibile aggiungere il codice aggiuntivo necessario per la copia profonda. Questo metodo è automatizzato e non richiede modifiche al codice per qualsiasi aggiunta o rimozione di campi nell'oggetto. È più lento e non consentito in un ambiente di attendibilità parziale
- È possibile utilizzare un codice lingua intermedio, che è più veloce ma comporta una minore leggibilità del codice e una manutenzione difficile
Per implementare la copia profonda:
- L'oggetto deve essere ben definito e non può essere arbitrario
- Le proprietà dell'oggetto non saranno prese in considerazione
- La clonazione deve essere automatizzata con intelligenza per casi speciali (come oggetti contenenti riferimenti non gestiti)