我正在尝试初始化类中的数组。 我得到“对象引用未设置为对象的实例”错误。
这是我的NPC课程:
namespace EngineTest
{
public class npcs
{
public int tileX, tileY, layerZ;
public int textureX, textureY;
public string ID;
public string state;
public int direction; //0 = south, 1= west, 2 = north, 3= east
public int moveLimitTimer;
public int animationCurrentFrame;
public int animationResetTimer;
public pathPotentials[, ,] pathPotential; (this is the array)
}
}
这是pathPotentials Class
namespace EngineTest
{
public class npcs
{
public int tileX, tileY, layerZ;
public int textureX, textureY;
public string ID;
public string state;
public int direction; //0 = south, 1= west, 2 = north, 3= east
public int moveLimitTimer;
public int animationCurrentFrame;
public int animationResetTimer;
public pathPotentials[, ,] pathPotential = new pathPotentials[Program.newMapWidth, Program.newMapHeight, Program.newMapLayers];
}
}
我尝试通过以下代码对其进行初始化:
for (z = 0; z < Program.newMapLayers; z++)
{
for (x = 0; x < Program.newMapWidth; x++)
{
for (y = 0; y < Program.newMapHeight; y++)
{
if(Program.tileNpcs[x, y, z].npcs.Count > 0)
{
Program.tileNpcs[x, y, z].npcs[0].pathPotential[Program.newMapWidth, Program.newMapHeight, Program.newMapLayers] = new pathPotentials();
}
}
}
}
但它不起作用。我该怎么办? 提前谢谢。
答案 0 :(得分:0)
代码必然会给你错误,因为在初始化之前你引用了一个特定的数组项。而不是你的陈述:
Program.tileNpcs[x, y, z].npcs[i].pathPotential[Program.newMapWidth, Program.newMapHeight, Program.newMapLayers] = new pathPotentials();
你应该这样:
Program.tileNpcs[x, y, z].npcs[i].pathPotential = new pathPotentials[Program.newMapWidth, Program.newMapHeight, Program.newMapLayers];
希望有所帮助..
答案 1 :(得分:0)
在C#(以及许多这种类型的编程语言)中,数组具有固定长度。在C#中,数组存储为具有一组值的对象。分配给数组中的元素就像改变对象的字段 - 您需要首先显式定义数组。如果没有明确定义它,C#不知道分配数组的内存量,这可能会在构造内存时造成很多问题。
您声明了一个三维数组,但没有定义它:
public pathPotentials[, ,] pathPotential;
你需要的是这样的东西:
public pathPotentials[, ,] pathPotential = new pathPotentials[Program.newMapWidth, Program.newMapHeight, Program.newMapLayers];
这告诉C#确切地说你的阵列有多大。
但是,这不允许您在声明数组后更改数组的大小(至少不通过重新定义来清除它)。如果你需要在运行时更改大小,那么C#提供了一个类List,它接受一个通用参数(在这种情况下,对于3D网格来说相当复杂)。您可以使用Lists声明类似的内容:
public List<List<List<pathPotentials>>> pathPotential = new List<List<List<pathPotentials>>>();
这为您提供了列表列表的嵌套列表。最里面的列表可能是z,最外面的x。要从中获取数据,您可以指定一个不足,但您不能再使用[x,y,z]作为符号,而必须使用[x] [y] [z],因为您正在访问列表获取另一个列表项,然后访问该列表以获取第二个列表项,然后访问该列表以获取您的对象。
希望这有助于您了解出现了什么问题,为什么代码无法正常运行,以及如何解决问题。