2D 阵列,程序崩溃

本文关键字:崩溃 程序 阵列 2D | 更新日期: 2023-09-27 17:55:47

这是一段来自使用 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;
      }
    }
  }
}

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

谁能看出出了什么问题?感谢您的支持!

2D 阵列,程序崩溃

数组

的创建不会创建对象本身,就像创建停车场不会创建停在那里的汽车一样。

您仍然需要自己创建对象。改变

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 = 0my_tile[x, y] = new Tile_Info(0)都是合法的。

您已经通过第一个 new 关键字创建了一个新的 2D Tile_Info数组。

您只创建了一个可以保存 Tile_Info 类型的项的空数组。创建单个项目并将它们放入数组中是您的工作。