Guide pratique pour écrire un constructeur de copie (Guide de programmation C#)
Les enregistrements C# fournissent un constructeur de copie pour les objets, mais pour les classes, vous devez en écrire un vous-même.
Important
L’écriture de constructeurs de copie qui fonctionnent pour tous les types dérivés d’une hiérarchie de classes peut être difficile. Si votre classe n’est pas sealed
, vous devez fortement envisager de créer une hiérarchie de types record class
pour utiliser le constructeur de copie synthétisé par le compilateur.
Exemple
Dans l’exemple suivant, la classe Person
définit un constructeur de copie qui prend comme argument une instance de Person
. Les valeurs des propriétés de l’argument sont assignées aux propriétés de la nouvelle instance de Person
. Le code contient un autre constructeur de copie qui envoie les propriétés Name
et Age
de l’instance que vous voulez copier au constructeur d’instance de la classe. La classe Person
est sealed
, de sorte qu’aucun type dérivé ne peut être déclaré qui pourrait introduire des erreurs en copiant uniquement la classe de base.
public sealed class Person
{
// Copy constructor.
public Person(Person previousPerson)
{
Name = previousPerson.Name;
Age = previousPerson.Age;
}
//// Alternate copy constructor calls the instance constructor.
//public Person(Person previousPerson)
// : this(previousPerson.Name, previousPerson.Age)
//{
//}
// Instance constructor.
public Person(string name, int age)
{
Name = name;
Age = age;
}
public int Age { get; set; }
public string Name { get; set; }
public string Details()
{
return Name + " is " + Age.ToString();
}
}
class TestPerson
{
static void Main()
{
// Create a Person object by using the instance constructor.
Person person1 = new Person("George", 40);
// Create another Person object, copying person1.
Person person2 = new Person(person1);
// Change each person's age.
person1.Age = 39;
person2.Age = 41;
// Change person2's name.
person2.Name = "Charles";
// Show details to verify that the name and age fields are distinct.
Console.WriteLine(person1.Details());
Console.WriteLine(person2.Details());
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
// Output:
// George is 39
// Charles is 41