Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-作为方法参数更改状态传递的对象_C#_Object_Reference_State_Method Parameters - Fatal编程技术网

C#-作为方法参数更改状态传递的对象

C#-作为方法参数更改状态传递的对象,c#,object,reference,state,method-parameters,C#,Object,Reference,State,Method Parameters,我有一个带有2d值数组的类矩阵作为公共属性: public class Matrix { public double[,] Values { get; set; } public Matrix(double[,] values) { Values = values; } ... } 我将*-操作符重载为矩阵中的静态方法: public static Matrix operator *(Matrix m, double opera

我有一个带有2d值数组的类矩阵作为公共属性:

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;
    }

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

我怀疑您的矩阵构造函数只是存储传入数组的值,而不是对其进行深度复制。在这种情况下,当数组被修改时,它将在两种情况下都被修改。

我怀疑您的矩阵构造函数只是存储传入数组的值,而不是对其进行深度复制。在这种情况下,当数组被修改时,它将在两种情况下都被修改。

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

var resMatrix = new Matrix(m.Values);
但是,
double[,]
也是一种参考类型!执行此操作时:

Values = values;
您仍然使
相互依赖,即更改一个值将影响另一个值

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

Values = values.Clone() as double[,];

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

var resMatrix = new Matrix(m.Values);
但是,
double[,]
也是一种参考类型!执行此操作时:

Values = values;
您仍然使
相互依赖,即更改一个值将影响另一个值

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

Values = values.Clone() as double[,];

是的,这是正确的,我将在问题中的代码示例中添加我的构造函数。你对如何创建深度拷贝有什么建议吗?为什么这需要在构造函数中发生?是的,这是正确的,我将把我的构造函数添加到我问题中的代码示例中。你对如何创建深度拷贝有什么建议吗?为什么这需要在构造函数中发生?