我有一个类矩阵与值的二维阵列作为公共属性:C# - 作为方法参数传递的对象改变状态
public class Matrix
{
public double[,] Values { get; set; }
public Matrix(double[,] values)
{
Values = values;
}
...
}
我重载* - 运算符作为基质内部的静态方法:
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是改变我ntended。但是在乘法之后,m1会获得与m2相同的值。我知道引用类型是作为引用传递给方法的,但我在堆上分配了一个新对象,其中调用了“var resMatrix = new Matrix(m.Values);”对?还是编译器将这两个对象合并为一个用于性能优化?是否有可能像价值类型一样保持m1不变?如果是这样,这是否是一种好习惯?
是的,这是正确的,我会将我的构造函数添加到我的问题的代码示例中。您对如何创建深度复制有任何建议吗?为什么这需要在构造函数中发生? –