如何编写复制构造函数(C# 编程指南)

C # 记录为对象提供复制构造函数,但对于类,你必须自行编写。

重要

编写适用于类层次结构中所有派生类型的复制构造函数可能很困难。 如果类不是 sealed,则强烈建议考虑创建 record class 类型的层次结构,以使用编译器合成的复制构造函数。

示例

在下面的示例中,Person定义一个复制构造函数,该函数使用 Person 的实例作为其参数。 该参数的属性值分配给 Person 的新实例的属性。 该代码包含一个备用复制构造函数,该函数发送要复制到该类的实例构造函数的实例的 NameAge 属性。 Person 类为 sealed,因此无法通过仅复制基类来声明可能会引发错误的派生类型。

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

请参阅