Copie profonde

Définition - Que signifie Deep Copy?

La copie profonde, en C #, fait référence à une technique par laquelle une copie d'un objet est créée de telle sorte qu'elle contienne des copies des membres d'instance et des objets pointés par les membres de référence.

La copie profonde est destinée à copier tous les éléments d'un objet, qui incluent des éléments directement référencés (de type valeur) et les éléments indirectement référencés d'un type de référence qui contient une référence (pointeur) vers un emplacement mémoire qui contient des données plutôt que de contenir le les données elles-mêmes. La copie profonde est utilisée dans les scénarios où une nouvelle copie (clone) est créée sans aucune référence aux données d'origine.

Definir Tech explique Deep Copy

La copie profonde diffère de la copie superficielle par la manière dont les membres du type de référence de l'objet sont copiés. Lors de la copie des membres de champ de type valeur dans les deux cas, une copie bit par bit du champ est effectuée. Lors de la copie de champs de type référence, la copie superficielle implique de ne copier que la référence, tandis qu'en copie complète, une nouvelle copie de l'objet référencé est effectuée.

La copie profonde peut être illustrée par un exemple en considérant un objet Employee ayant AddressInfo comme membre de type référence avec d'autres membres de type valeur. Une copie complète de Employee crée un nouvel objet, Employee2, avec des membres de type valeur égal à Employee mais fait référence à un nouvel objet, AddressInfo2, qui est une copie de AddressInfo.

La copie profonde peut être implémentée à l'aide de l'une des méthodes suivantes:

  • Le constructeur de copie de la classe peut être implémenté avec la logique nécessaire pour copier les membres des types valeur et référence (après une allocation de mémoire appropriée). Cette méthode est fastidieuse et sujette aux erreurs.
  • La méthode System.Object.MemberwiseClone peut être utilisée pour copier les membres non statiques de type valeur. Des copies d'objets de type référence peuvent être créées et affectées avec le même jeu de valeurs que l'original
  • Un objet qui doit être copié en profondeur peut être sérialisé et dé-sérialisé en un nouvel objet en le restaurant. Cette méthode est automatisée et ne nécessite pas de changements de code pour les modifications dans les membres de l'objet, mais est plus lente que les autres méthodes et nécessite que l'objet cloné soit sérialisable
  • La réflexion avec récursivité peut être utilisée pour obtenir une copie superficielle, à quel point le code supplémentaire nécessaire pour la copie profonde peut être ajouté. Cette méthode est automatisée et ne nécessite aucune modification de code pour tout ajout ou suppression de champs dans l'objet. Il est plus lent et interdit dans un environnement de confiance partielle
  • Le code de langage intermédiaire peut être utilisé, ce qui est plus rapide mais entraîne une moindre lisibilité du code et une maintenance difficile

Pour implémenter la copie profonde:

  • L'objet doit être bien défini et ne peut pas être arbitraire
  • Les propriétés de l'objet ne seront pas prises en compte
  • Le clonage doit être automatisé avec intelligence pour des cas particuliers (comme les objets contenant des références non gérées)