Copier un objet en C#

Muhammad Maisam Abbas 11 décembre 2023
  1. Copier un objet avec la méthode MemberWiseClone() en C#
  2. Copier un objet avec la méthode constructeur paramétrée en C#
Copier un objet 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.

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

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

Article connexe - Csharp Class