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

标签 c# types reference operators

我正在将矩阵库作为一个学习项目,在这样做的过程中,我重载了 * 运算符来执行矩阵乘法。我还重载了它来处理标量乘法(将矩阵的每个元素乘以 double )。我的问题是,当运行以下代码时,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;
}

最佳答案

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

我不确定您的复制方法/构造函数是什么,但是不要m1 分配给ret;您应该制作 m1副本,修改副本,然后返回副本,留下 m1 未更改

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

关于c# - 乘法运算符重载修改原始变量(C#)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17787924/

相关文章:

c# - 如何在 Windows 10 应用程序中动态更改 Split View背景颜色

c# - Shellsort,2.48^(k-1) vs Tokuda 的序列

scala - 取决于参数类型的返回类型(例如 Await.ready())不能按预期工作

typescript - 在 typescript 中提供一种对象类型

C# 设计模式 - 与 Base 交互

c# - 如何在 asp.net mvc 3 中不使用 ajax 的情况下渲染某些特定 div 中的部分 View ?

java - java 是否包含名为 "Item"的数据类型?

java - 我可以使用另一个 ArrayList 中的引用来更改一个 ArrayList 中的对象吗?

html - 我想更改 html 文件中的 css 引用

javascript - 如何确定列表中的位置以插入 div