在类中使用数组

时间:2012-12-05 09:23:40

标签: c# arrays class initialization

我正在尝试初始化类中的数组。 我得到“对象引用未设置为对象的实例”错误。

这是我的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();
                    }
                }
            }
        }

但它不起作用。我该怎么办? 提前谢谢。

2 个答案:

答案 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],因为您正在访问列表获取另一个列表项,然后访问该列表以获取第二个列表项,然后访问该列表以获取您的对象。

希望这有助于您了解出现了什么问题,为什么代码无法正常运行,以及如何解决问题。