Taula de continguts:
Definició: què significa Deep Copy?
La còpia profunda, en C #, fa referència a una tècnica mitjançant la qual es crea una còpia d’un objecte de manera que conté còpies tant dels membres d’instància com dels objectes als quals els membres de referència.
La còpia profunda està destinada a copiar tots els elements d’un objecte, que inclouen elements de referència directa (de tipus de valor) i els elements de referència indirecta d’un tipus de referència que manté una referència (punter) a una ubicació de memòria que conté dades en lloc de contenir la dades en si. La còpia profunda s'utilitza en els escenaris en què es crea una nova còpia (clon) sense cap referència a les dades originals.
Techopedia explica Còpia profunda
La còpia profunda difereix de la còpia superficial de la forma en què es copien els membres del tipus de referència de l'objecte. Mentre es copien els membres del camp de tipus de valor en ambdós casos, es realitza una còpia a poc a poc del camp. Quan es copia un camp de tipus de referència, la còpia superficial consisteix a copiar només la referència, mentre que en còpia profunda, es realitza una nova còpia de l'objecte referit.
Es pot il·lustrar una còpia profunda amb un exemple considerant un objecte Employee que té AddressInfo com a membre del tipus de referència juntament amb altres membres de tipus valor. Una còpia profunda de Employee crea un nou objecte, Employee2, amb membres de tipus de valor igual a Employee però fa referència a un objecte nou, AddressInfo2, que és una còpia de AddressInfo.
La còpia profunda es pot implementar mitjançant qualsevol dels mètodes següents:
- El constructor de còpia de la classe es pot implementar amb la lògica necessària per copiar membres tant de tipus de valor com de referència (després d'assignació adequada de memòria). Aquest mètode és tediós i propens a errors.
- El mètode System.Object.MemberwiseClone es pot utilitzar per copiar els membres no estàtics del tipus de valor. Es poden crear i assignar còpies d'objectes de tipus de referència amb el mateix conjunt de valors que l'original
- Un objecte que ha de ser copiat profundament es pot serialitzar i des-serialitzar en un objecte nou mitjançant la restauració. Aquest mètode està automatitzat i no requereix canvis de codi per a modificacions en membres d'objecte, però és més lent que altres mètodes i requereix que l'objecte clonat pugui ser serialitzable
- La reflexió amb recurs es pot utilitzar per obtenir una còpia poc profunda, moment en el qual es pot afegir el codi addicional necessari per a una còpia profunda. Aquest mètode està automatitzat i no requereix canvis de codi per a qualsevol addició o eliminació de camps de l'objecte. És més lent i no està permès en un entorn de confiança parcial
- Es pot utilitzar un codi de llenguatge intermedi, que és més ràpid, però té una menor lectura de codis i un manteniment difícil
Per implementar una còpia profunda:
- L’objecte ha d’estar ben definit i no pot ser arbitrari
- No es consideraran propietats de l'objecte
- La clonació s'ha de automatitzar amb intel·ligència per a casos especials (com ara objectes que contenen referències no gestionades)