1

我之前遇到过几次这个问题。这是一个示例代码:

public void moveRight(int x, int y, int rows, int columns)
    {
        char[,] imatrix = GameInstance.vexedGame.getLastMatrix(); // <-- creating a variable and initializing it.
        char letter = imatrix[x, y]; // Doesn't matters
        char[,] oldMatrix = imatrix; // Creating a new var that is the same as the variable created before
        if (imatrix[x, (y + 1)] == '-')
        {
            //LINE 1
            GameInstance.vexedGame.setLastMatrix(oldMatrix); //Setting the var of this class to the old matrix (until here everything's fine)
            imatrix[x, (y + 1)] = letter;
            imatrix[x, y] = '-'; //Changing the matix
            //LINE 2
            GameInstance.vexedGame.setActualMatrix(imatriz); //Setting the actual matrix.
        }
    }

发生的情况是,当我在整个事情中放置断点时,当我到达 //LINE 1 时,该值与更改前的矩阵副本一起保存。在我在 //LINE 2 中进行更改后,不仅 imatrix 的值发生了变化,而且第一个矩阵的值也发生了变化,因此 GameInstance.vexedGame.setLastMatrix 发生了变化。我真的不知道为什么会发生这种情况,如果有人可以帮助我,我将不胜感激。谢谢!

(对不起,我的英语不好)

4

2 回答 2

4

那是因为它是一个数组,而数组是引用类型。

当你这样做

char[,] oldMatrix = imatrix;

这会创建一个浅拷贝。即内存中的地址被传递给oldmatrix. 现在它们是两个变量,但指向内存中的相同地址。如果你先改变第二个显然必须改变。

为了避免这种使用循环将每个值从第一个复制到第二个或

做一个深拷贝。

于 2013-05-04T04:07:32.233 回答
1

好的,在这里扩展其他答案。要进行深层复制,您需要手动遍历值并以这种方式分配它们,或者使用预构建的方法。可以工作的东西是Array.CopyTo(); 现在这会带来问题,因为它是一维数组副本,但可以通过一些编码来解决。一个有用的略有不同的辅助函数是Array.Copy(); 这是为了复制值的范围。

它是一维的原因是不知道数据大小在二维内的参差不齐。因此,这高度依赖于该多维数组的结构。因此,除非您可以发布结构以寻求帮助,否则开发人员必须解决该问题。

于 2013-05-04T05:10:07.493 回答