Megosztás a következőn keresztül:


Másoláskonstruktor írása (C# programozási útmutató)

A C# -rekordok egy példánykonstruktort biztosítanak az objektumokhoz, de az osztályokhoz saját maga kell írnia egyet.

Fontos

Az osztályhierarchiában az összes származtatott típushoz használható másoláskonstruktorok írása nehéz lehet. Ha az osztály nem sealedaz, érdemes lehet létrehoznia egy hierarchiát a record class fordító-szintetizált másolási konstruktor használatához.

Példa

Az alábbi példában az Personosztály egy példánykonstruktort határoz meg, amely argumentumként a példány egy példányát Personveszi fel. Az argumentum tulajdonságainak értékei az új példány Persontulajdonságaihoz vannak rendelve. A kód egy másik példánykonstruktort tartalmaz, amely elküldi a Name másolni kívánt példány tulajdonságait és Age tulajdonságait az osztály példánykonstruktorának. Az Person osztály így sealednem deklarálható olyan származtatott típusok, amelyek csak az alaposztály másolásával okozhatnak hibákat.

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

Lásd még