[英]Object reference not set to an instance of an object - C#
我是C#的初学者,并且不断收到“ System.NullReferenceException”错误。 我到处都看过,但似乎找不到有用的解决方案。 我简化了下面的代码,以使其更加清晰。
namespace tile_test
{
public class Game1 : Game
{
public static float bottomWorld = 38400f;
public static float rightWorld = 134400f;
public static int maxTilesX = (int)rightWorld / 16 + 1;
public static int maxTilesY = (int)bottomWorld / 16 + 1;
public Game1()
{
Tile[,] tile = new Tile[maxTilesX, maxTilesY];
int x = 1;
int y = 1;
tile[x, y].active = false; //Error on this line.
}
}
}
Tile类如下所示
namespace tile_test
{
public class Tile
{
public bool active;
}
}
有人可以帮我吗?
您已经声明了一个数组来存储需要的尺寸的Tile对象,但是此数组的每个插槽均为NULL,因此您无法引用NULL尝试将属性分配为active
Tile[,] tile = new Tile[maxTilesX, maxTilesY];
int x = 1;
int y = 1;
tile[x, y] = new Tile() {active=false};
对于计划存储在数组中的每个Tile,都需要这样的代码
首先初始化tile[x, y]
tile[x, y] = new Tile();
tile[x, y].active = false;
要初始化数组的所有元素,您可以创建一个实用程序方法
T[,] Create2DimArray<T>(int len1,int len2) where T: new()
{
T[,] arr = new T[len1, len2];
for (int i = 0; i < len1; i++)
{
for (int j = 0; j < len2; j++)
{
arr[i, j] = new T();
}
}
return arr;
}
并用作
Tile[,] tile = Create2DimArray<Tile>(maxTilesX, maxTilesY);
尝试执行不存在的对象的操作(具有null
)时,将引发System.NullReferenceException
在这种情况下,数组中位置1,1的Tile尚不存在,因此数组在适当的引用位置存储null
值。
您需要实例化Tiles数组中的所有项目,然后才能尝试使用它们。 创建数组时,它们都具有默认的null
值,因为堆上尚没有要引用的对象。
如果要一次创建所有切片,只需在创建阵列后完成:
for (int i = 0; i < maxTilesX; i++)
{ // loop through "rows" of tiles
for (int j = 0; j < maxTilesY; j++)
{ // loop through corresponding "column" of tiles
tile[i, j] = new Tile(); // create a Tile for the array to reference
tile[i, j].active = false; // some initialization
}
}
众所周知,C#使用零索引数组,因此数组中的第一项实际上是tile[0, 0]
:如果您想了解更多信息tile[0, 0]
参见MSDN C#数组教程中有关数组的更多信息。 抱歉,如果您已经知道这一点!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.