Table des matières:
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 contient 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 comprennent les éléments directement référencés (de type valeur) et les éléments référencés indirectement d'un type de référence qui contient une référence (pointeur) vers un emplacement de 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.
Techopedia explique Deep Copy
La copie profonde diffère de la copie superficielle par la manière dont les membres de type 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 copier uniquement la référence, tandis qu'en copie profonde, une nouvelle copie de l'objet référencé est effectuée.
La copie complète peut être illustrée par un exemple en considérant un objet Employé 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 ensemble 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 modifications de code pour les modifications des membres d'objet, mais elle 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, auquel cas le code supplémentaire nécessaire pour une copie complète peut être ajouté. Cette méthode est automatisée et ne nécessite pas de modifications de code pour tout ajout ou suppression de champs dans l'objet. Il est plus lent et n'est pas autorisé dans un environnement de confiance partielle
- Un code de langue 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 complète:
- 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)
