Да, это возможно, но вы должны понимать разницу между следующими двумя строками кода.
Это пример назначения :
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>
класса.