C # создает класс, имея объекты в качестве переменных-членов? Я думаю, что объекты являются мусором? - PullRequest
0 голосов
/ 06 апреля 2010

Итак, у меня есть класс, который имеет следующие переменные-члены. У меня есть функции get и set для каждого элемента данных в этом классе.

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 = новый NavigationMesh [502,502];

Я использую двойной цикл for, чтобы назначить это, моя проблема в том, что я не могу получить нужные мне данные из объекта узла Vector3 после того, как я создаю этот объект в моем массиве с моими «получателями».

Я пытался сделать Vector3 статической переменной, однако я думаю, что это относится к последнему экземпляру объекта. Как мне сохранить все эти объекты в памяти? Я думаю, что там был мусор. Есть мысли?

Ответы [ 5 ]

4 голосов
/ 06 апреля 2010

В C # не создавайте get и устанавливайте такие функции. Используйте свойство:

public float X
{
   get {Console.WriteLine(node.X); return X;}
}

public bool IsWall {get;set;}

Если у вас есть ссылки на эти предметы, они не являются сборщиком мусора.

3 голосов
/ 06 апреля 2010

Если вы поддерживаете ссылку на них, они гарантированы до НЕ получают мусор .

Я не понимаю, где вы определяете node. Возможно ли, что другой кусок кода мешает ему? Это объявлено статическим? Если он объявлен как статический, существует только один его экземпляр (вместо одного на класс), и это может стать источником некоторой путаницы.

Почему ваше node поле объявлено открытым?

Я бы поместил это в свойство и установил точку останова на установленном методе доступа, чтобы вы могли видеть, где он изменяется.

1 голос
/ 06 апреля 2010

Vector3 - это структура, поэтому она не является объектом. Это ценность. Это означает, что это определенно не мусор.

Это тип значения, поэтому каждый раз, когда вы передаете его, создается копия. Может быть, вы получите копию и измените ее? Мне непонятно, что вы имеете в виду, когда говорите, что не можете получить данные из узла.

0 голосов
/ 06 апреля 2010

Мы не можем видеть, какой код вы используете для создания экземпляра массива 502 на 502: вы уверены, что создаете новый узел для каждого? Если да, то вы легко сможете получить свойства. mesh [x, y] .getWall () даст вам правильное значение для данных x и y.

0 голосов
/ 06 апреля 2010

В определении класса все кажется мне кошерным, за исключением того, что поле узла объявлено общедоступным - вам следует избегать этого, но я надеюсь, что вы не присваиваете ему значение null.
Если вы этого не сделаете, ваш объект Vector не будет собирать мусор.

Так что именно происходит, когда вы пытаетесь получить доступ к геттерам? GetX генерирует исключение нулевого указателя?

...