0

私は C# の初心者ですが、「System.NullReferenceException」エラーが発生し続けます。私はいたるところを見てきましたが、有用な解決策が見つからないようです。より明確になるように、以下のコードを単純化しました。

namespace tile_test
{
    public class Game1 : Game
    {
        public static float bottomWorld = 38400f;
        public static float rightWorld = 134400f;
        public static int maxTilesX = (int)rightWorld / 16 + 1;
        public static int maxTilesY = (int)bottomWorld / 16 + 1;


        public Game1()
        {
            Tile[,] tile = new Tile[maxTilesX, maxTilesY];
            int x = 1;
            int y = 1;
            tile[x, y].active = false; //Error on this line.
        }
    }
}

Tile クラスを以下に示します。

namespace tile_test
{
    public class Tile
    {
        public bool active;
    }
}

誰か助けてくれませんか?

4

3 に答える 3

2

必要な次元の Tile オブジェクトを格納する配列を宣言しましたが、この配列のすべてのスロットが NULL であるため、アクティブなプロパティを割り当てようとして NULL を参照することはできません

Tile[,] tile = new Tile[maxTilesX, maxTilesY];
int x = 1;
int y = 1;
tile[x, y] = new Tile() {active=false};

配列に格納する予定のすべてのタイルに対して、このようなコードが必要です

于 2013-05-19T17:51:57.853 に答える
2

最初の初期化tile[x, y]

tile[x, y] = new Tile();
tile[x, y].active = false;

配列のすべての要素を初期化するには、ユーティリティ メソッドを作成できます

 T[,] Create2DimArray<T>(int len1,int len2) where T: new()
    {
        T[,] arr = new T[len1, len2];
        for (int i = 0; i < len1; i++)
        {
            for (int j = 0; j < len2; j++)
            {
                arr[i, j] = new T();
            }
        }
        return arr;
    }

そしてそれを次のように使用します

Tile[,] tile = Create2DimArray<Tile>(maxTilesX, maxTilesY);
于 2013-05-19T17:52:10.790 に答える
0

System.NullReferenceException存在しない ( の値を持つ) オブジェクトの操作を実行しようとすると、Aがスローnullされます。この場合、配列内の位置 1,1 にあるタイルはまだ存在しないため、配列には値が格納されます。null適切な参照の代わりに。

それらを試して使用する前に、Tiles 配列内のすべてのアイテムをインスタンス化する必要があります。null配列を作成すると、ヒープ上にまだ参照するオブジェクトがないため、すべてデフォルト値になります。

一度にすべてのタイルを作成したい場合は、配列を作成した後にこれを行うだけです。

for (int i = 0; i < maxTilesX; i++)
{ // loop through "rows" of tiles
    for (int j = 0; j < maxTilesY; j++)
    { // loop through corresponding "column" of tiles
        tile[i, j] = new Tile(); // create a Tile for the array to reference
        tile[i, j].active = false; // some initialization
    }
}

ご存知のように、C# はゼロ インデックス配列を使用するため、配列の最初の項目は実際にはtile[0, 0]: 詳細については、MSDN C# 配列チュートリアルの配列の詳細を参照してください。知ってたらごめんなさい!

于 2013-05-19T17:59:28.097 に答える