C#创建一个Class,将对象作为成员变量?我认为对象是垃圾收集?

时间:2010-04-05 20:08:28

标签: c# garbage-collection class object navigation

所以我有一个具有以下成员变量的类。我已经为这个类中的每一段数据设置了函数。

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设为静态变量,但我认为它是指对象的最后一个实例。如何将所有这些对象保留在内存中?我认为收集了垃圾。有什么想法吗?

5 个答案:

答案 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的正确值。