使用构造函数 class 复制现有 class 实例

Using a constructor class to make a copy of an existing class instance

我是 OOP 的新手,所以请多多包涵。我在使用 class 构造函数复制现有 class 时遇到问题。下面是一个示例,其中我创建了 class 的初始实例,使用 class 构造函数复制它,然后修改初始 class 中的 属性 值.这也会修改复制的 class 中的相同值,这不是我想要实现的行为。 (我希望它保留为修改前存在的初始 class。)在此先感谢您的帮助!

class Program
{
    static void Main(string[] args)
    {
        // Make initial instance, make a copy, and write the copied values to console
        myClass myInitialInstance = new myClass();
        myClass myOtherInstance = new myClass(myInitialInstance);
        Console.WriteLine("Copied Instance: {0}, {1}, {2}", myOtherInstance.Input1[0], myOtherInstance.Input1[1], myOtherInstance.Input1[2]);

        // Make change to initial instance
        myInitialInstance.Input1 = new double[] { 10, 10, 10 };

        // Notice in the display that myOtherInstance inherits the {10,10,10} values from myInitialInstance
        Console.WriteLine("Initial Instance: {0}, {1}, {2}", myInitialInstance.Input1[0], myInitialInstance.Input1[1], myInitialInstance.Input1[2]);
        Console.WriteLine("Copied Instance: {0}, {1}, {2}", myOtherInstance.Input1[0], myOtherInstance.Input1[1], myOtherInstance.Input1[2]);
        Console.ReadKey();

    }
}

public class myClass
{
    public double[,] AllPoints { get; set; }
    public double[] Input1 { get { return GetRow(0); } set { SetRow(0, value); } }
    public double[] Input2 { get { return GetRow(1); } set { SetRow(1, value); } }

    private double[] GetRow(int i) { return new double[] { AllPoints[i, 0], AllPoints[i, 1], AllPoints[i, 2] }; }
    private void SetRow(int i, double[] value)
    {
        AllPoints[i, 0] = value[0];
        AllPoints[i, 1] = value[1];
        AllPoints[i, 2] = value[2];
    }

    public myClass() { AllPoints = new double[2, 3]; }

    public myClass(myClass anotherInstance) { AllPoints = anotherInstance.AllPoints; }
}

以上代码产生以下输出:

复制的实例:0,0,0 初始实例:10、10、10 复制的实例:10, 10, 10

我希望输出如下:

复制的实例:0,0,0 初始实例:10、10、10 复制的实例:0, 0, 0

目前,您的复制构造函数只是将 anotherInstance 的引用分配给正在创建的 MyClass 的当前实例。这导致新创建的 class 可以看到对原始数组的任何更改,因为 它们指向同一个数组 。你真正想要做的是在你的复制构造函数中复制数组

public MyClass(MyClass anotherInstance) 
{
    Array.Copy(anotherInstance.AllPoints,
               this.AllPoints, 
               anotherInstance.AllPoints.Length); 
}