Copier des objets en C# : analyse approfondie
L'extrait de code suivant illustre un scénario dans lequel deux références d'objet objectA
et objectB
pointent vers la même instance de la classe MyClass
. Il s'agit d'un comportement courant pour les types référence en C# puisqu'ils font uniquement référence à un emplacement mémoire plutôt que de contenir les données elles-mêmes. Cependant, dans certains cas, il est nécessaire de créer des copies totalement indépendantes de l'objet, pointant vers des adresses mémoire différentes.
Utilisez ICloneable pour une copie superficielle
Afin d'implémenter une copie superficielle (en copiant uniquement l'état des membres de type non référence de l'objet d'origine), C# fournit l'interface ICloneable
. L'implémentation de cette interface permet à une classe de définir un comportement de clonage personnalisé.
<code class="language-csharp">class myClass : ICloneable { public String test; public object Clone() { return this.MemberwiseClone(); } }</code>
MemberwiseClone
effectue une copie superficielle de l'objet, en copiant les valeurs de tous les membres de type non référence. Nous créons un mécanisme de clonage personnalisé pour la classe ICloneable
en implémentant MemberwiseClone
et en remplaçant sa méthode Clone
par MyClass
.
Créer des objets indépendants
Pour créer une instance autonome de MyClass
, utilisez la méthode Clone
:
<code class="language-csharp">myClass a = new myClass(); myClass b = (myClass)a.Clone();</code>
Cela fera objectB
faire référence à une nouvelle instance de MyClass
qui a une adresse mémoire différente de celle de objectA
. Cependant, il est important de noter qu'il s'agit d'une copie superficielle, ce qui signifie que tous les membres de type référence au sein de l'objet pointent toujours vers le même emplacement mémoire que l'objet d'origine. Pour implémenter une copie complète, une copie supplémentaire des membres de type référence est généralement requise.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!