C# 当2D数组存储的对象从未寻址时,它如何更改值?

C# 当2D数组存储的对象从未寻址时,它如何更改值?,c#,.net,oop,multidimensional-array,C#,.net,Oop,Multidimensional Array,我正在编写国际象棋的代码,并创建了一个名为BoardObject的类来存储棋盘状态,这样我就可以有一个棋盘状态列表,从而创建游戏的历史记录。BoardObject有一个名为boardValues的字段,它是一个2D数组,用于存储电路板上每个正方形的值 在我玩游戏的while循环中,如果用户输入通过了我的有效性检查,那么他们输入的移动将被传递到一个名为movePieceTrad的方法中。在movePieceTrad过程中,列表板历史记录会以某种方式更改,以便随着刚才的移动而更新。问题是:moveP

我正在编写国际象棋的代码,并创建了一个名为BoardObject的类来存储棋盘状态,这样我就可以有一个棋盘状态列表,从而创建游戏的历史记录。BoardObject有一个名为boardValues的字段,它是一个2D数组,用于存储电路板上每个正方形的值

在我玩游戏的while循环中,如果用户输入通过了我的有效性检查,那么他们输入的移动将被传递到一个名为movePieceTrad的方法中。在movePieceTrad过程中,列表板历史记录会以某种方式更改,以便随着刚才的移动而更新。问题是:movePieceTrad中没有boardHistory或任何boardObject的地址。我已经用ctrl+f浏览了一遍,所有对boardHistory的引用都在main方法中

在下面的代码中,当我调试时,lastInBoardHistory2与movePieceTrad之前的lastInBoardHistory1不同,但当我通过movePieceTrad时,lastInBoardHistory1也会发生变化,这再次没有意义。发生了什么事

lastInBoardHistory1 = boardHistory[boardHistory.Count - 1].getBoardValues();
movePieceTrad(arr[0], arr[1]);
lastInBoardHistory2 = boardHistory[boardHistory.Count - 1].getBoardValues();
下面是BoardObject类的代码

namespace chess_v1
{
    class BoardObject
    {
        private int[,] boardValues;
        public int[,] possibleEnPassants;
        public int[,] castlePiecesMoved;
        public int turn = 0;

        public BoardObject(int[,] squareValues, int[,] pep, int[,]castleInfo, int inputTurn)
        {
            boardValues = squareValues;
            possibleEnPassants = pep;
            castlePiecesMoved = castleInfo;
            turn = inputTurn;
        }

        public int[,] getBoardValues()
        {
            return boardValues;
        }
    }
}

好的,我已经解决了

构建BoardObject时,我传入了输入2D数组,并简单地将它们设置为BoardObject中的字段2D数组。由于2D数组是指向内存中位置的引用数组,而不是自包含的数组数组,这意味着最终我只是将主方法板中的引用传递给每个BoardObject中的字段。所以,当我移动一个片段(改变主方法板中的值)时,BoardObject,实际上每个BoardObject,也都改变了

解决方法是,我没有在BoardObject的构造函数中传入引用数组,而是传入带有嵌套for循环的值。我已经测试了在本期发行之前应该可以使用的功能,现在一切都很好

这是新的BoardObject代码;除此之外,我不需要做任何改变:

namespace chess_v1
{
    class BoardObject
    {
        public int[,] boardValues = new int[8,8];
        public int[,] possibleEnPassants = new int[8,2];
        public int[,] castlePiecesMoved = new int[2,3];
        public int turn = 0;

        public BoardObject(int[,] squareValues, int[,] pep, int[,]castleInfo, int inputTurn)
        {
            for (int i = 0; i < 8; i++)
            {
                for (int k = 0; k < 8; k++)
                {
                    boardValues[i, k] = squareValues[i, k];
                }
            }
            for (int i = 0; i < 8; i++)
            {
                for (int k = 0; k < 2; k++)
                {
                    possibleEnPassants[i, k] = pep[i, k];
                }
            }
            for (int i = 0; i < 2; i++)
            {
                for (int k = 0; k < 3; k++)
                {
                    castlePiecesMoved[i, k] = castleInfo[i, k];
                }
            }
            turn = inputTurn;
        }
    }
}
namespace chess\u v1
{
类BoardObject
{
公共整数[,]boardValues=新整数[8,8];
公共整数[,]可能通路=新整数[8,2];
public int[,]castlePiecesMoved=新int[2,3];
公共整数回合=0;
公共BoardObject(int[,]squareValues,int[,]pep,int[,]castleInfo,int InputUrn)
{
对于(int i=0;i<8;i++)
{
对于(int k=0;k<8;k++)
{
板值[i,k]=平方值[i,k];
}
}
对于(int i=0;i<8;i++)
{
对于(int k=0;k<2;k++)
{
可能通路[i,k]=pep[i,k];
}
}
对于(int i=0;i<2;i++)
{
对于(int k=0;k<3;k++)
{
castlePiecesMoved[i,k]=castleInfo[i,k];
}
}
转动=转动;
}
}
}

请为
movePieceTrad
数组添加代码
lastInBoardHistory1
lastInBoardHistory2
可能指向内存中的同一对象。movePieceTrad包含整个程序中的大部分功能,需要粘贴很多。我可以告诉你的是,lastInBoardHistory1的值在movePieceTrad期间不会改变,我在它上面放了一块手表,并逐步通过了“movePieceTrad包含了整个程序中的大部分功能,粘贴起来会很困难”——然后不要。作为提出问题的人,你的工作就是花时间构建一个好的例子来说明你的问题。这很可能是所有其他“我正在重用引用类型实例,而不是为每个值创建新实例”问题的重复。但如果你认为你的问题与此不同,你需要提供更好的背景。另请参阅,尤其是该页底部链接的文章。可能重复的