Могу ли я создать несколько объектов в одной переменной? - PullRequest
0 голосов
/ 09 мая 2018

Например:

Enemy enemy;
if(enemy == null)
{
    Enemy enemy = new Enemy();
}

И если этот враг мертв, каким-то образом удалите экземпляр и повторно поместите его в ту же переменную, объявленную выше.

Редактировать: я использую это для консольной игры в подземелье, и я хочу, чтобы после убийства монстра вы получили еще одну схватку.

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Да, это возможно, но вы должны понимать разницу между следующими двумя строками кода.

Это пример назначения :

a = 10;

Это пример переменной объявление с инициализатором.

var a = 10;

Переменная может быть назначена столько раз, сколько вы хотите, но может быть объявлена ​​только один раз (в пределах области видимости).

Так что вы определенно можете сделать это:

var enemy = new Enemy(); //Declaration
enemy = new Enemy();     //Assignment
enemy = null;            //Assignment
enemy = new Enemy();     //Assignment

Но вы не можете сделать это:

var enemy = new Enemy(); //Declaration
var enemy = new Enemy();  //Declaration - will not compile

Возвращаясь к вашему примеру, рабочая версия может выглядеть так:

class Game
{
    private Enemy enemy = null; //You have to initialize a field before you can check it, even if you're just checking for null

    public Enemy GetEnemy()
    {
        if (enemy == null)
        {
            enemy = new Enemy();  //Here I am only assigning, not declaring
        }
        return enemy;
    }
}

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

Если все, что вам нужно, это ленивая загрузка, как это, вы можете также рассмотреть возможность использования Lazy<T> класса.

0 голосов
/ 09 мая 2018

Удаление объектов в .net является обязанностью сборщика мусора, поэтому вам не нужно удалять их, как, скажем, в C ++.

Объект удаляется сборщиком мусора, как только на него нет (корневой) ссылки. Поэтому, если вы просто переназначите переменную, на старый объект больше не будет ссылаться, и сборщик мусора позаботится об этом через некоторое время.

Если момент, когда объект разрушен, важен (он удерживает и должен освободить некоторые важные ресурсы), тогда вам нужно реализовать IDisposable.

Enemy enemy;

// ...

// time to create the enemy
enemy = new Enemy(); // creating the first one

// ... do something with the first enemy

// creating the second one
enemy = new Enemy(); 
// now there's no reference to the first enemy and it will be destroyed

// playing with second enemy

// dropping the second enemy - it's not referenced now, too and 
// will be destroyed
enemy = null; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...