Я кодирую в Unity, и я обнаружил, что иногда метод может вызываться функцией Invoke, даже если объект игры был уничтожен. Вот почему я добавил эту проверку, и, похоже, она работает правильно, но это довольно странно.если (! This) {возврат; } имеет смысл в C#?
Предположим, у меня есть объект, который я хочу уничтожить за одну секунду. Я добавляю Invoke в Awake, чтобы его уничтожить. Но также, я хочу немедленно уничтожить игровой объект, если игра окончена. Объект подписывается на событие Gameover.
void Awake()
{
Invoke ("_destroy", 1);
GameMachine.Gameover += _destroy;
}
Метод _destroy как это:
void _destroy()
{
if (!this) {
return;
}
GameMachine.Gameover -= _destroy;
Destroy (this.gameObject);
}
Я добавил, что если проверить, потому что я обнаружил, что Invoke может достигнуть метод _destroy, даже если объект (это!) был уже уничтожен игрой по событию. Это имеет смысл, возможно ли это случиться?
Благодаря
Чтобы ответить на вопрос, заданный в заголовке: 'if (! This)' обычно не компилируется и не имеет смысла в C#. Однако класс 'Object' Unity поддерживает [неявное преобразование в' bool'] (http://docs.unity3d.com/412/Documentation/ScriptReference/Object-operator_bool.html), который проверяет, был ли объект уничтожен. –
Спасибо, Майкл Лю. Это означает, что если бы этот код был в классе, отличном от MonoBehaviour, он даже не компилировался бы? – DavidGuaita
Это правильно (если, конечно, этот класс не поддерживает преобразование в 'bool'). –