Delen via


Een kopieerconstructor schrijven (C#-programmeerhandleiding)

C# -records bieden een kopieerconstructor voor objecten, maar voor klassen moet u er zelf een schrijven.

Belangrijk

Het schrijven van kopieerconstructors die werken voor alle afgeleide typen in een klassehiërarchie kan lastig zijn. Als uw klasse dat niet sealedis, kunt u overwegen om een hiërarchie van record class typen te maken om de gecompileerde kopieerconstructor te gebruiken.

Opmerking

In het volgende voorbeeld definieert de Person klasse een kopieerconstructor die, als argument, een exemplaar van Person. De waarden van de eigenschappen van het argument worden toegewezen aan de eigenschappen van het nieuwe exemplaar van Person. De code bevat een alternatieve kopieerconstructor waarmee de Name en Age eigenschappen van het exemplaar dat u naar de exemplaarconstructor van de klasse wilt kopiëren, worden verzonden. De Person klasse is sealed, dus er kunnen geen afgeleide typen worden gedeclareerd die fouten kunnen veroorzaken door alleen de basisklasse te kopiëren.

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

Zie ook