乘法运算符重载修改原始变量(C#)?

时间:2013-07-22 12:44:17

标签: c# types reference operators

我正在研究一个矩阵库作为学习项目,并且这样做我已经重载了*运算符来执行矩阵乘法。我也重载了它来处理标量乘法(将矩阵的每个元素乘以一倍)。我的问题是,当运行以下代码时,test2和test都被修改,这是不希望的。

Matrix test2 = 2 * test;

我确定这是一个问题,因为Matrix是一个类,因此通过引用传递,但没有将Matrix更改为结构(我认为不适合的东西,并且在尝试时没有似乎没有用,我看不出任何解决方法。我该如何解决这个问题?

实际的操作员代码是

public static Matrix operator *(Matrix m1, double c)
{
   Matrix ret = m1;

   for (long i = 0; i < ret.Width; i++) // Iterate over the rows.
    {
        for (long p = 0; p < ret.Height; p++) // Iterate over the columns.
        {
            ret[i, p] *= c;
        }
    }

   return ret;
}

2 个答案:

答案 0 :(得分:5)

您不应该使用代码修改现有矩阵。签名尖叫它正在创建一个 new Matrix并将其返回。

我不认为您的复制方法/构造函数是什么,但m1分配给ret;您应该制作m1副本,修改副本,然后返回副本,留下m1 < EM>不变

public static Matrix operator *(Matrix m1, double c)
{
    Matrix ret = m1.Clone(); //not sure what your "copy" method is

    //do the multiplication on ret

    return ret;
}

答案 1 :(得分:1)

由于Matrix是引用类型,ret = m1不会复制输入参数,而是最终修改它。

解决此问题的正确方法是制作m1的深层副本并对其进行修改。类似的东西:

Matrix ret = m1.MakeCopy(); // you need to define this

// and now you are free to modify ret as much as you like