Clonare un oggetto in .NET significa crearne una copia identica ma distinta.
Non esiste però un solo tipo di clonazione, bensì due: la shallow copy e la deep copy. Per copia shallow si intende una copia di un oggetto in cui viene clonato solo l'oggetto padre e non i figli mentre al contrario una deep copy è una clonazione del padre e di tutti i suoi figli. Per comprendere meglio questa differenza facciamo un semplice esempio.
Abbiamo un Array List di oggetti Ordine. Ogni oggetto Ordine
contiene a sua volta un oggetto Cliente
. Se effettuiamo una shallow copy dell'Array List otterremo una copia dell'Array List i cui elementi punteranno agli stessi oggetti del primo Array List, avremo ottenuto quindi una copia dell'Array List ma non dei suoi oggetti figli. Se invece dello stesso Array List effettuiamo una deep copy, otterremo una copia dell'Array List ed una copia di ciascun oggetto Ordine
in esso contenuto nonché di ciascun oggetto Cliente
in ciascun Ordine
.
Se in una propria classe si intende fornire la funzionalità di clonazione dell'oggetto è opportuno implementare l'interfaccia ICloneable
e di conseguenza il metodo Clone
della stessa. In questo caso decidere il tipo di clonazione da eseguire (se shallow o deep) ed in ogni caso ricordarsi sempre di specificarlo nella documentazione del metodo.
Nel caso si opti per la shallow copy è possibile semplificare l'operazione richiamando il metodo MemberwiseClone del proprio oggetto:
public class Ordine : ICloneable { public object Clone() { return this.MemberwiseClone(); } }