Procedimiento para escribir un constructor de copia (Guía de programación de C#)

Los registros de C# proporcionan un constructor de copia para objetos, pero debe escribir uno para las clases personalmente.

Importante

Escribir constructores de copia que funcionen para todos los tipos derivados de una jerarquía de clases puede ser difícil. Si la clase no está sealed, conviene considerar la posibilidad de crear una jerarquía de tipos record class para usar el constructor de copia sintetizado por el compilador.

Ejemplo

En el ejemplo siguiente, Personclass define un constructor de copias que toma, como argumento, una instancia de Person. Los valores de las propiedades de los argumentos se asignan a las propiedades de la nueva instancia de Person. El código contiene un constructor de copias alternativo que envía las propiedades Name y Age de la instancia que quiere copiar al constructor de instancia de la clase. La clase Person está sealed, por lo que no se pueden declarar tipos derivados que puedan introducir errores porque solo se copie la clase 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

Vea también