初始化固定长度的class数组并在C#中动态添加值

Initialize array of a class with fixed length and dynamically add values in C#

我想要一个二维游戏板,每个字段都是自定义的 class,其中包含有关该字段的信息和属性。游戏板的大小在实例化时是已知的,属性的值不是。实例化后,我想为每个字段随机设置它们。我最初的想法是创建一个数组,而不是一个列表,因为游戏板的大小总是固定的。

public class GameBoard
{
    private int _xValue;
    private int _yValue;
    private int _bombs;

    private int _fields;

    public Field[][] gameBoard;

    public GameBoard(int x, int y)
    {
        _xValue = x;
        _yValue = y;
        _fields = _xValue * _yValue;

        gameBoard = new[] { new Field[_xValue], new Field[_yValue] };
    //Here I have to initialize every Field

        for (int i = 0; i < _xValue; i++)
        {
            for (int j = 0; j < _yValue; j++)
            {
                //Set properties of Field
                //For example: gameBoard[i][j].IsBomb = RandomBoolean;
                //Here I get NullReferenceExceptions
            }
        }
    }
}

我明白为什么这不起作用。我尝试了列表、二维数组,或者像现在这样的锯齿状数组,这是我更喜欢的。我怎样才能以可读、干净的方式解决这个问题?

编辑

领域class:

public class Field
{
    public bool IsBomb { get; set; }
    public bool IsFlagged { get; set; }
}

我试图在嵌套的 forloop 中添加 gameBoard[i][j] = new Field();。这会导致 IndexOutOfRangeException。

这是你的数组-属性:

public Field[,] gameBoard;

这是初始化:

public GameBoard(int x, int y)
{
    _xValue = x;
    _yValue = y;
    _fields = _xValue * _yValue;

    gameBoard = new Field[_xValue, _yValue];
    for (int i = 0; i < _xValue; i++)
    {
        for (int j = 0; j < _yValue; j++)
        {
            gameBoard[i, j] = new Field();
        }
    }
 }

这里有很多关于如何使用锯齿状数组的困惑。如果你想使用锯齿状数组,你必须以这种方式设置

//Declare jagged array, I want _xValue arrays
Field[][] gameBoard = new Field[_xValue][];

for (int i = 0; i < _xValue; i++)
{
    gameBoard[i] = new Field[_yValue];
    for (int j = 0; j < _yValue; j++)
    {
        gameBoard[i][j] = new Field(){ IsBomb = RandomBoolean};
    }
}

多维数组中的等价物是

//Declare multi-dimensional array of size _xValue x _yValue
Field[,] gameBoard2 = new Field[_xValue, _yValue];

for(int i = 0; i < _xValue; i++)
{
    for(int j = 0; j < _yValue; j++)
    {
        // Instantiate the Field object at x,y
        gameBoard2[i, j] = new Field { IsBomb = RandomBoolean };
    }
}