c# - 二维数组,程序崩溃

标签 c# multidimensional-array

这是一段来自使用二维数组的 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];

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

最佳答案

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

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

my_tile[x, y].id = 0;

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

只有在使用引用类型 (class) 时才会发生这种情况,因为存储在数组中的是对实例的引用,而不是实例本身。在较低级别上,这(或多或少)意味着实例的内存尚未分配,只是用于其引用的内存,因此您必须新建实例以对其进行初始化。另一方面,如果 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) 都是合法的。

关于c# - 二维数组,程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14517203/

相关文章:

c# - Winforms 最小化技术

c# - 将 MSDN 示例从 C# 转换为 C++/CLI

c# - 关于 C# 中的 IEnumerable 接口(interface)的一些说明?

java - 递归和/或 getBackground() 未按预期工作

c++ - 在运行时填充多维 vector

java - 需要一种高效的算法来解决这种复杂的结构

ruby - 如何将二维数组投影到 Ruby 中的新数组中?

c# - OfficeOpenXML excel 调整行大小并合并单元格

c# - LDAP 过滤器编码器更换

javascript - 在 JavaScript 多维对象中引用数字