2D阵列,程序崩溃

The*_*lar 2 c# multidimensional-array

这是来自使用2d数组的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;
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

根据调试器,它是因为"对象引用未设置为对象的实例",但我很确定这就是我在这里所做的事情:my_tile = new Tile_Info[width, height];.

谁能告诉我哪里错了?感谢您的支持!

SWe*_*eko 7

阵列的创建不会自己创建对象,就像创建停车场不会创建停放在那里的汽车一样.

您仍然需要自己创建对象.更改

my_tile[x, y].id = 0;
Run Code Online (Sandbox Code Playgroud)

my_tile[x, y] = new Tile_Info(0);
Run Code Online (Sandbox Code Playgroud)

这只发生在使用引用类型(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;}
}
Run Code Online (Sandbox Code Playgroud)

双方my_tile[x, y].id = 0my_tile[x, y] = new Tile_Info(0)会一直法律.