这是来自使用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];
。
任何人都可以说出错了什么?感谢您的支持!
答案 0 :(得分: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)
都是合法的。
答案 1 :(得分:1)
您已通过第一个新关键字创建了新的2D Tile_Info数组。
您只创建了一个可以容纳Tile_Info类型项的空数组。你的工作是创建单个项目并将它们放入阵列中。