我正在尝试用C#制作一个简单的基于文本的游戏。我想要实现这一点是通过向表单添加标签(而不是使用命令提示符)。我在将它们添加到屏幕时遇到了一些麻烦。 Visual Studio提供了一个未指定的错误(仅表示我有一个未处理的异常):
对象引用未设置为对象的实例
当我尝试使用数组用这些标签填充屏幕时。代码:
private void Main_Game_Load(object sender, EventArgs e)
{
Label[] Enemies = new Label[20];
Label[] Projectile = new Label[5];
Font font = new Font(new System.Drawing.FontFamily("Microsoft Sans Serif"), 12);
Random rand = new Random();
Point point = new Point(rand.Next(500), rand.Next(500));
for (int i = 0; i < Enemies.Length; i++)
{
Enemies[i].Text = "E";
Enemies[i].Font = font;
Enemies[i].BackColor = ColorTranslator.FromHtml("#000000");
Enemies[i].Location = point;
Enemies[i].Size = new Size(12, 12);
Enemies[i].Name = "Enemy"+i.ToString();
this.Controls.Add(Enemies[i]);
}
}
我想知道这个问题可能隐藏在哪里?我用谷歌搜索了它,我的代码似乎应该可以工作(除了现在点不会随意尝试填充)。
答案 0 :(得分:3)
这行代码创建一个空数组(即每个引用任何内容的元素),最多可存储20个标签:
Label[] Enemies = new Label[20];
您必须明确地在数组中创建每个标签:
for (int i = 0; i < Enemies.Length; i++)
{
//creates a new label and stores a reference to it into i element of the array
Enemies[i] = new Label();
//...
}
来自Single-Dimensional Arrays (C# Programming Guide):
SomeType[] array4 = new SomeType[10];
此语句的结果取决于SomeType是否为值 类型或引用类型。如果它是值类型,则语句创建 一个包含10个元素的数组,每个元素都具有SomeType类型。如果 SomeType是引用类型,该语句创建一个10的数组 元素,每个元素都被初始化为空引用。
答案 1 :(得分:2)
创建数组时,将使用该类型的默认值填充所有元素。对于null
的所有引用类型。您需要为数组中的每个项目实际创建一个新的Label
:
for (int i = 0; i < Enemies.Length; i++)
{
Enemies[i] = new Label();
//...