数组在无关对象内变化

时间:2012-04-30 22:58:35

标签: c# arrays stack heap

对于我年终项目,我需要开发图像处理和人工智能应用程序。

我的图像处理已经完成,所以我正在转向AI。不过我在这里遇到了问题。

我将尝试描述这里的情况。

为了正确的图像处理,我需要一个可以通过检查器规则验证电路板的AI。因此,我需要检查具有最后已知状态的游戏区域的当前状态。

为此,我创建了一个具有currentBoard二维数组的对象。以及使用currentBoard(=最后已知状态)验证电路板原始输入的方法。

然而,当我的图像处理对象的另一个对象用他的方法完成时。它将改变我的AI对象中的数组currentBoard

对于我在主窗体中创建的新数组,这是相同的。我认为这是堆/堆栈的原因。

我希望我的问题清晰易懂。我知道我不是最好的描述情况,所以当你完全不了解某个部分时请告诉我。

1 个答案:

答案 0 :(得分:1)

数组是引用类型,因此,正如您所发现的那样,在一个位置更改数组内容会更改任何其他包含对同一对象的引用的代码。

为避免更改数组,您应该获取二维数组的深层副本,然后使用副本。请注意,我们必须深入复制数组及其内部数组:

        int[][] original = {new[] {1,2,3}, new[] {4,5,6}};

        int[][] deepCopy = new int[original.Length][];

        for (int index = 0; index < original.Length; index++)
        {
            var row = original[index];
            int[] rowCopy = new int[row.Length];
            row.CopyTo(rowCopy, 0);

            deepCopy[index] = rowCopy;
        }

您也可以使用一些简单的linq生成相同的结果:

int[][] deepCopyLinq = original.Select(x => x.ToArray()).ToArray();