我有一个 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 就像值类型一样,如果是这样,这是好的和常见的做法吗?