你调用的对象是空的

iTE*_*Egg 5 .net c# arrays nullreferenceexception

我有一节课:

public class Cell
{
    public enum cellState
    {
        WATER,
        SCAN,
        SHIPUNIT,
        SHOT,
        HIT
    }

    public Cell()
    {
        currentCell = cellState.WATER;
        MessageBox.Show(currentCell.ToString());
    }

    public cellState currentCell { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后我尝试在以下类中使用它:

public class NietzscheBattleshipsGameModel
{
    private byte MAXCOL = 10;
    private byte MAXROW = 10;

    public Cell[,] HomeArray;

    private Cell[,] AwayArray;

    public NietzscheBattleshipsGameModel()
    {
        HomeArray = new Cell [MAXCOL, MAXROW];

        AwayArray = new Cell [MAXCOL, MAXROW];
    }


    public string alphaCoords(Int32 x)
    {
        if (x < 0 || x > 9)
        {
            throw new ArgumentOutOfRangeException();
        }

        char alphaChar = (char)('A' + x);

        return alphaChar.ToString();
    }

    public void test()
    {
        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 10; j++)
            {

                // Object reference not set to an instance of an object.
                MessageBox.Show(HomeArray[i,j].currentCell.ToString());
                ///////////////////////////////////////////////////////

            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我最终将Object引用设置为一个对象的实例(在上面的代码中/////之间..

我试过创建一个Cell的单个实例,它工作正常.

jas*_*son 12

实例化数组时,数组中的项将接收该类型的默认值.因此

T[] array = new T[length];
Run Code Online (Sandbox Code Playgroud)

这是每一个的情况下i0 <= i < length我们有array[i] = default(T).因此,对于参考类型array[i]将是null.这就是你看到的原因NullReferenceException.在你的情况下Cell是一个引用类型,所以你有

HomeArray = new Cell [MAXCOL, MAXROW]; 
Run Code Online (Sandbox Code Playgroud)

你所做的就是建立一个对Cells 的引用数组,但是你从未将这些引用分配给Cell.也就是说,你告诉编译器"给我一个可以保存对Cells的引用的数组",但你没有告诉编译器"给我一个可以保存对Cells的引用的数组,并将每个引用分配给一个新的实例Cell." 因此,编译器将设置这些引用的初始值null.因此,您需要初始化HomeArray:

for (int i = 0; i < MAXCOL; i++)  { 
    for (int j = 0; j < MAXROW; j++)  { 
        HomeArray[i, j] = new Cell();
    } 
}
Run Code Online (Sandbox Code Playgroud)