Copier un objet en C#
-
Copier un objet avec la méthode
MemberWiseClone()
enC#
-
Copier un objet avec la méthode constructeur paramétrée en
C#
Ce didacticiel présentera des méthodes pour copier un objet en C#.
Copier un objet avec la méthode MemberWiseClone()
en C#
Malheureusement, il n’existe aucun moyen intégré de créer une copie distincte d’un objet en C#. Ce phénomène est illustré dans l’exemple de code suivant.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace copy_an_object {
class myClass {
public String test;
}
class Program {
static void Main(string[] args) {
myClass a = new myClass();
a.test = "This is a test";
myClass b = a;
b.test = "This is not a test";
Console.WriteLine(a.test);
Console.WriteLine(b.test);
}
}
}
Production:
This is not a test This is not a test
Nous obtenons la même sortie les deux fois car une instance d’une classe en C# est une variable de type référence qui pointe vers un emplacement mémoire spécifique. En raison de la nature orientée objet de C#, le nouveau pointeur b
pointe également vers l’emplacement mémoire de a
.
Si nous voulons créer un emplacement mémoire séparé pour b
, nous devons nous fier à certaines approches définies par l’utilisateur. La méthode MemberWiseClone()
est utilisée pour créer une copie séparée des valeurs de l’objet appelant en C#. Le type de retour de la fonction MemberWiseClone()
est object. L’exemple de code suivant nous montre comment créer une copie séparée d’un objet de classe avec la fonction MemberWiseClone()
en C#.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace copy_an_object {
class myClass {
public String test;
public object Clone() {
return this.MemberwiseClone();
}
}
class Program {
static void Main(string[] args) {
myClass a = new myClass();
a.test = "This is a test";
myClass b = (myClass)a.Clone();
b.test = "This is not a test";
Console.WriteLine(a.test);
Console.WriteLine(b.test);
}
}
}
Production:
This is a test This is not a test
Cette fois, il ressort clairement de la sortie qu’il existe une copie distincte pour chaque objet de classe. Nous avons implémenté la fonction MemberWiseClone()
à l’intérieur de la fonction Clone()
de la classe myClass
. La fonction Clone()
renvoie une copie séparée de l’objet de classe. La valeur de retour de la fonction Clone()
est transtypée en myClass
et pointée par l’objet de classe b
.
Copier un objet avec la méthode constructeur paramétrée en C#
Nous pouvons créer un constructeur de classe paramétré pour atteindre le même objectif en C#. Nous pouvons passer l’objet de classe précédent au constructeur d’un nouvel objet de classe et en copier toutes les valeurs. L’exemple de code suivant nous montre comment créer une copie distincte d’un objet de classe avec la méthode constructeur paramétrée en C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace copy_an_object {
class MyClass {
public String test;
public MyClass() {}
public MyClass(MyClass other) {
test = other.test;
}
}
class Program {
static void Main(string[] args) {
MyClass a = new myClass();
a.test = "This is a test";
MyClass b = new MyClass(a);
b.test = "This is not a test";
Console.WriteLine(a.test);
Console.WriteLine(b.test);
}
}
}
Production:
This is a test This is not a test
Nous avons créé un constructeur paramétré pour la classe MyClass
qui prend un objet de la classe MyClass
et en copie la chaîne test
. Dans la fonction main
, nous avons créé l’objet a
de la classe MyClass
et l’avons passé au constructeur de b
.
Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.
LinkedIn