Kopya oluşturucu yazma (C# Programlama Kılavuzu)

C# kayıtları nesneler için bir kopya oluşturucu sağlar, ancak sınıflar için kendiniz yazmanız gerekir.

Önemli

Sınıf hiyerarşisindeki tüm türetilmiş türler için çalışan kopya oluşturucuları yazmak zor olabilir. Sınıfınız değilse sealed, derleyici tarafından sentezlenen kopya oluşturucuyu kullanmak için bir tür hiyerarşisi record class oluşturmayı kesinlikle göz önünde bulundurmalısınız.

Örnek

Aşağıdaki örnekte sınıfı, Person bağımsız değişkeni olarak öğesinin bir örneğini Personalan bir kopya oluşturucu tanımlar. Bağımsız değişkeninin özelliklerinin değerleri, yeni örneğinin Personözelliklerine atanır. Kod, sınıfın örnek oluşturucusunun Name kopyalamak istediğiniz örneğin ve Age özelliklerini gönderen alternatif bir kopya oluşturucu içerir. Person sınıfıdır, sealedbu nedenle yalnızca temel sınıfı kopyalayarak hatalara neden olabilecek türetilmiş türler bildirılamaz.

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

Ayrıca bkz.