Partilhar via


Como escrever um construtor de cópia (Guia de Programação em C#)

Os registros C# fornecem um construtor de cópia para objetos, mas para classes você mesmo precisa escrever um.

Importante

Escrever construtores de cópia que funcionam para todos os tipos derivados em uma hierarquia de classe pode ser difícil. Se sua classe não sealedfor , você deve considerar fortemente a criação de uma hierarquia de tipos para usar o construtor de cópia sintetizada record class pelo compilador.

Exemplo

No exemplo a seguir, a Person classe define um construtor de cópia que toma, como seu argumento, uma instância de Person. Os valores das propriedades do argumento são atribuídos às propriedades da nova instância de Person. O código contém um construtor de cópia alternativo que envia as Name propriedades e Age da instância que você deseja copiar para o construtor de instância da classe. A Person classe é sealed, portanto, nenhum tipo derivado pode ser declarado que poderia introduzir erros copiando apenas a classe 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

Consulte também