2

これは、2 次元配列を使用する C# プロジェクトからのコードの一部です。何らかの理由で、プログラムが完全にコンパイルされることを理解していませんが、実行時にクラッシュします。

public class Tile_Info
{
  public int id;

  public Tile_Info(int _id)
  {
    id = _id;
  }
}

class Program
{

  public static void Main(string[] args)
  {
    int width = 20;
    int height = 30;

    Tile_Info[,] my_tile;
    my_tile = new Tile_Info[width, height];

    for(int y = 0; y < height; y++)
    {
      for(int x = 0; x < width; x++)
      {
        my_tile[x, y].id = 0;
      }
    }
  }
}

デバッガーによると、「オブジェクト参照がオブジェクトのインスタンスに設定されていない」ためですが、ここで行っていることは確かですmy_tile = new Tile_Info[width, height];

誰が何が悪いのか分かりますか?ご支援いただきありがとうございます!

4

2 に答える 2

7

駐車場を作成してもそこに駐車する車が作成されないのと同様に、配列を作成してもオブジェクト自体は作成されません。

オブジェクトを自分で作成する必要があります。変化する

my_tile[x, y].id = 0;

my_tile[x, y] = new Tile_Info(0);

これは、参照型 ( class) が使用されている場合にのみ発生します。これは、配列に格納されているものがインスタンス自体ではなく、インスタンスへの参照であるためです。下位レベルでは、これは (多かれ少なかれ) インスタンスのメモリがまだ割り当てられておらず、参照用のメモリのみであることを意味するためnew、インスタンスを起動して初期化する必要があります。一方、Tile_Infoが値型 ( struct) の場合、配列には実際のインスタンスが含まれ、new Tile_Info[width, height] 割り当てられたメモリが有効な開始状態 (すべてゼロ) に初期化されます。これは、値型の既定のパラメーターなしのコンストラクターが行うこととまったく同じです。 .

したがって、Tile_Info を次のように定義したとします。

public struct Tile_Info
{
  public int id; // this should be a property, public fields are baaad
  public Tile_Info(int _id){ id = _id;}
}

両方ともmy_tile[x, y].id = 0合法my_tile[x, y] = new Tile_Info(0)だったでしょう。

于 2013-01-25T07:24:05.137 に答える
1

最初の new キーワードによって新しい 2D Tile_Info 配列を作成しました。

Tile_Info 型の項目を保持できる空の配列のみを作成しました。個々のアイテムを作成して配列に配置するのはあなたの仕事です。

于 2013-01-25T07:28:29.110 に答える