C# 数组';s值的更改没有任何表面原因

C# 数组';s值的更改没有任何表面原因,c#,arrays,multidimensional-array,tic-tac-toe,C#,Arrays,Multidimensional Array,Tic Tac Toe,我正试图将一个非常基本的人工智能嵌入到一个Tic Tac Toe游戏中,我遇到了一个阵列问题,我用它来识别最合适的方块 我有一个数组,它代表游戏网格的当前状态,另一个数组表示如果某个正方形被声明,它的外观 人工智能不断做出奇怪的决定,所以我决定让它在某些里程碑上报告各种信息 string[,] currentGrid; string[,] hypotheticalGrid; MessageBox.Show(currentGrid); hypotheticalGrid = currentGr

我正试图将一个非常基本的人工智能嵌入到一个Tic Tac Toe游戏中,我遇到了一个阵列问题,我用它来识别最合适的方块

我有一个数组,它代表游戏网格的当前状态,另一个数组表示如果某个正方形被声明,它的外观

人工智能不断做出奇怪的决定,所以我决定让它在某些里程碑上报告各种信息

string[,] currentGrid;
string[,] hypotheticalGrid;


MessageBox.Show(currentGrid);

hypotheticalGrid = currentGrid;
hypotheticalGrid[x, y] = "O";

MessageBox.Show(currentGrid);
请记住,以上是实际代码的一个非常简化的版本

数组沿行分配值,消息框设置为按包含值的顺序显示currentGrid

除了消息框之间的代码外,其他一切都正常工作

问题在于,两个消息框显示不同的结果,即使后者是前者的副本,并且在两个消息框之间的空格中未指定对currentGrid的更改

中间的两行是直接从源代码复制的,应该只影响假设的网格。显而易见,这些线应该重置假设的网格,然后在所讨论的正方形上添加一个“O”

但是,由于某些原因,“O”也会被放置在当前网格中


我做错了什么?

问题是你的作业:

hypotheticalGrid = currentGrid;
只是一个引用赋值,这意味着现在它们都指向内存中的同一个数组,因此对假设网格的任何更改都会影响当前网格


您需要一份完整的项目副本,以便它们不会相互干扰。

hypoticalgrid=currentGrid
不会复制currentGrid,而是两个变量都指向同一个数组。因此,假设网格中的任何更改也将在currentGrid中看到

您应该将假设网格作为currentGrid的副本:

hypotheticalGrid = (string[,])currentGrid.Clone();

在这种情况下,
Clone()
将起作用,因为字符串在.NET中是不可变的。在其他情况下,
Clone
可能不够好,只是需要注意。

请记住,数组是引用类型。分配会复制引用,但不会创建数组的副本。赋值后,两个数组变量都指向同一个数组

您可以像这样创建阵列副本:

string[] hypotheticalGrid = new string[currentGrid.Length];
Array.Copy(currentGrid, hypotheticalGrid, currentGrid.Length);
请注意,这不会创建数组中包含的项的副本,但这不是问题,因为字符串是不可变的。也就是说,如果操作其中一个数组中的字符串,这将创建一个新字符串,因此对第二个数组没有影响


编辑:

通过查看其他帖子,我发现使用
Clone
方法可以更轻松地完成:

string[] hypotheticalGrid = currentGrid.Clone();