Jak napsat konstruktor kopírování (Průvodce programováním v C#)

Záznamy jazyka C# poskytují konstruktor kopírování pro objekty, ale pro třídy, které musíte napsat sami.

Důležité

Psaní konstruktorů kopírování, které fungují pro všechny odvozené typy v hierarchii tříd, může být obtížné. Pokud vaše třída není sealed, měli byste důrazně zvážit vytvoření hierarchie typů record class pro použití konstruktoru syntetizovaného kopírování kompilátoru.

Příklad

V následujícím příkladu Persontřída definuje konstruktor kopírování, který jako svůj argument instance Person. Hodnoty vlastností argumentu jsou přiřazeny k vlastnostem nové instance Person. Kód obsahuje alternativní konstruktor kopírování, který odesílá Name a Age vlastnosti instance, kterou chcete zkopírovat do konstruktoru instance třídy. Třída Person je sealed, takže žádné odvozené typy nelze deklarovat, které by mohly zavést chyby zkopírováním pouze základní třídy.

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

Viz také