Definição – o que significa Deep Copy?
Cópia profunda, em C #, refere-se a uma técnica pela qual uma cópia de um objeto é criada de forma que contenha cópias de membros de instância e de objetos apontados por membros de referência.
A cópia profunda se destina a copiar todos os elementos de um objeto, que incluem elementos diretamente referenciados (do tipo de valor) e os elementos indiretamente referenciados de um tipo de referência que contém uma referência (ponteiro) para um local de memória que contém dados em vez de conter o dados em si. A cópia profunda é usada em cenários onde uma nova cópia (clone) é criada sem qualquer referência aos dados originais.
Definirtec explica Deep Copy
A cópia profunda difere da cópia superficial na maneira como os membros do tipo de referência do objeto são copiados. Ao copiar os membros do campo de tipo de valor em ambos os casos, uma cópia bit a bit do campo é executada. Na cópia de campos do tipo referência, a cópia superficial envolve a cópia apenas da referência, enquanto na cópia profunda é realizada uma nova cópia do referido objeto.
A cópia profunda pode ser ilustrada com um exemplo considerando um objeto Employee tendo AddressInfo como um membro do tipo de referência junto com outros membros do tipo de valor. Uma cópia profunda de Employee cria um novo objeto, Employee2, com membros do tipo de valor igual a Employee, mas faz referência a um novo objeto, AddressInfo2, que é uma cópia de AddressInfo.
A cópia profunda pode ser implementada usando qualquer um dos seguintes métodos:
- O construtor de cópia da classe pode ser implementado com a lógica necessária para copiar membros dos tipos de valor e de referência (após a alocação de memória apropriada). Este método é tedioso e sujeito a erros.
- O método System.Object.MemberwiseClone pode ser usado para copiar os membros não estáticos do tipo de valor. Cópias de objetos do tipo de referência podem ser criadas e atribuídas com o mesmo conjunto de valores do original
- Um objeto que precisa ser copiado em profundidade pode ser serializado e desserializado em um novo objeto, restaurando-o. Este método é automatizado e não requer alterações de código para modificações nos membros do objeto, mas é mais lento do que outros métodos e requer que o objeto clonado seja serializável
- A reflexão com recursão pode ser usada para obter uma cópia superficial, ponto em que o código adicional necessário para a cópia profunda pode ser adicionado. Este método é automatizado e não requer alterações de código para qualquer adição ou remoção de campos no objeto. É mais lento e não é permitido em ambiente de confiança parcial
- O código de idioma intermediário pode ser usado, o que é mais rápido, mas resulta em menor legibilidade do código e manutenção difícil
Para implementar a cópia profunda:
- O objeto deve ser bem definido e não pode ser arbitrário
- Propriedades do objeto não serão consideradas
- A clonagem deve ser automatizada com inteligência para casos especiais (como objetos contendo referências não gerenciadas)