所以我有一个具有以下成员变量的类。我已经为这个类中的每一段数据设置了函数。
public class NavigationMesh
{
public Vector3 node;
int weight;
bool isWall;
bool hasTreasure;
public NavigationMesh(int x, int y, int z, bool setWall, bool setTreasure)
{
//default constructor
//Console.WriteLine(x + " " + y + " " + z);
node = new Vector3(x, y, z);
//Console.WriteLine(node.X + " " + node.Y + " " + node.Z);
isWall = setWall;
hasTreasure = setTreasure;
weight = 1;
}// end constructor
public float getX()
{
Console.WriteLine(node.X);
return node.X;
}
public float getY()
{
Console.WriteLine(node.Y);
return node.Y;
}
public float getZ()
{
Console.WriteLine(node.Z);
return node.Z;
}
public bool getWall()
{
return isWall;
}
public void setWall(bool item)
{
isWall = item;
}
public bool getTreasure()
{
return hasTreasure;
}
public void setTreasure(bool item)
{
hasTreasure = item;
}
public int getWeight()
{
return weight;
}
}// end class
在另一个类中,我有一个看起来像这样的2-Dim数组
NavigationMesh [,] mesh;
mesh = new NavigationMesh [502,502];
我使用双循环来分配这个,我的问题是我用我的“getters”在我的数组中创建这个对象后,无法从Vector3节点对象中获取所需的数据。
我尝试将Vector3设为静态变量,但我认为它是指对象的最后一个实例。如何将所有这些对象保留在内存中?我认为收集了垃圾。有什么想法吗?
答案 0 :(得分:4)
在C#中,不要构建get和set这样的函数。使用属性:
public float X
{
get {Console.WriteLine(node.X); return X;}
}
public bool IsWall {get;set;}
如果你有这些项目的参考,它们不会被垃圾收集。
答案 1 :(得分:3)
如果您要保留对它们的引用,则保证 不会收集垃圾。
我看不到你在哪里定义 node
。是否有可能另一段代码干扰它?它被宣布为静态吗?如果它被声明为静态,那么它只有一个实例(而不是每个类一个),这可能是一些混乱的根源。
为什么您的node
字段已公开?
我会把它放在一个属性中,并在set访问器上设置一个断点,以便你可以看到它被修改的位置。
答案 2 :(得分:1)
Vector3是一个结构,因此它不是一个对象。这是一个价值。这意味着绝对不会被垃圾收集。
这是一种值类型,因此每次沿着副本传递它都会产生。难道你得到一份副本并修改它吗?当你说你无法从节点中获取数据时,我不清楚你的意思。
答案 3 :(得分:0)
在类定义中,除了节点字段被声明为public之外,一切似乎都是犹太人 - 你应该避免这种情况,但我希望你不要为它指定null。
如果不这样做,您的Vector对象将不会被垃圾收集。
那么当您尝试访问getter时究竟发生了什么? GetX会抛出空指针异常吗?
答案 4 :(得分:0)
我们无法看到您使用什么代码来实例化502 x 502数组:您确定要为每个数组实例化一个新节点吗?如果是,那么您应该可以轻松地检索属性。 mesh [x,y] .getWall()会给出给定x和y的正确值。