0

我有一个 Matrix 类,其中包含一个 2d 数组作为公共属性:

public class Matrix
{
    public double[,] Values { get; set; }

    public Matrix(double[,] values)
    {
        Values = values;
    }
    ...
}

我将 *-Operator 重载为 Matrix 内部的静态方法:

    public static Matrix operator *(Matrix m, double operand)
    {
        var resMatrix = new Matrix(m.Values);
        for (var i = 0; i < resMatrix.Values.GetLength(0); i++)
        {
            for (var j = 0; j < resMatrix.Values.GetLength(1); j++)
            {
                resMatrix[i, j] *= operand;
            }
        }
        return resMatrix;
    }

我在我的主要课程中做了以下工作:

internal class Program
{
    public static void Main(string[] args)
    {
        var m1 = new Matrix(new double[,]
        {
            {1, 2, 3},
            {4, 5, 6},
            {7, 8, 9}
        });
        Console.WriteLine(m1);

        var m2 = m1 * 2;

        Console.WriteLine(m2);
        Console.WriteLine(m1);
    }
}

运算符本身工作正常,m2 按预期更改。但是 m1 在乘法后得到与 m2 相同的值。我知道引用类型作为引用传递给方法,但我在堆上分配了一个新对象,调用“var resMatrix = new Matrix(m.Values);” 对?或者编译器是否将这两个对象合并为一个以进行性能优化?是否有可能保持 m1 就像值类型一样,如果是这样,这是好的和常见的做法吗?

4

2 回答 2

2

如您所知,Matrix是引用类型,因此您创建了一个新变量:

var resMatrix = new Matrix(m.Values);

不过,double[,]也是参考类型!当你这样做时:

Values = values;

你们仍然在互相依赖Values和依赖,即改变一个人的价值会影响另一个人。values

为此,您需要创建一个副本。一种方法是Clone

Values = values.Clone() as double[,];
于 2017-07-02T17:00:57.997 回答
0

我怀疑您的 Matrix 构造函数只是存储传入数组的值,而不是对其进行深层复制。在这种情况下,当数组被修改时,它会在两个实例中被修改。

于 2017-07-02T16:51:18.820 回答