Gewusst wie: Schreiben eines Kopierkonstruktors (C#-Programmierhandbuch)

C#-Datensätze bieten einen Kopierkonstruktor für Objekte, jedoch müssen Sie für Klassen selbst einen schreiben.

Wichtig

Das Schreiben von Kopierkonstruktoren, die für alle abgeleiteten Typen in einer Klassenhierarchie funktionieren, kann schwierig sein. Wenn Ihre Klasse nicht sealed ist, sollten Sie dringend erwägen, eine Hierarchie von record class-Typen zu erstellen, um den vom Compiler synthetisierten Kopierkonstruktor zu verwenden.

Beispiel

Im folgenden Beispiel wird von der Person-Klasse ein Kopierkonstruktor definiert, der eine Instanz von Person als sein Argument annimmt. Die Werte der Eigenschaften des Arguments werden den Eigenschaften der neuen Instanz von Person zugewiesen. Der Code enthält einen alternativen Kopierkonstruktor, der die Name- und Age-Eigenschaften der Instanz sendet, die Sie in den Instanzenkonstruktor der Klasse kopieren möchten. Die Person-Klasse ist sealed, sodass keine abgeleiteten Typen deklariert werden können, die Fehler verursachen könnten, weil nur die Basisklasse kopiert wird.

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

Siehe auch