Udostępnij za pośrednictwem


Jak napisać konstruktor kopiujący (Przewodnik programowania w języku C#)

Rekordy języka C# udostępniają konstruktor kopii dla obiektów, ale w przypadku klas trzeba samodzielnie pisać.

Ważne

Pisanie konstruktorów kopii, które działają dla wszystkich typów pochodnych w hierarchii klas, może być trudne. Jeśli klasa nie sealedjest , należy zdecydowanie rozważyć utworzenie hierarchii record class typów, aby użyć konstruktora kopiowania syntetyzowanego kompilatora.

Przykład

W poniższym przykładzie Person klasa definiuje konstruktor kopiujący, który przyjmuje jako argument wystąpienie klasy Person. Wartości właściwości argumentu są przypisywane do właściwości nowego wystąpienia klasy Person. Kod zawiera alternatywny konstruktor kopiowania, który wysyła Name właściwości i Age wystąpienia, które chcesz skopiować do konstruktora wystąpienia klasy. Klasa Person to sealed, więc nie można zadeklarować żadnych typów pochodnych, które mogą powodować błędy przez skopiowanie tylko klasy bazowej.

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

Zobacz też