如果(!this){return;}在C#中有意义?

如果(!this){return;}在C#中有意义?,c#,events,unity3d,destroy,C#,Events,Unity3d,Destroy,我在Unity中编写代码,我发现有时调用函数可以调用方法,即使游戏对象已被销毁。 这就是为什么我添加了这个检查,它似乎工作正常,但它很奇怪 假设我有一个物体,我想在一秒钟内自我毁灭。 我在唤醒时添加一个调用来自我销毁它。 而且,如果游戏结束,我想立即销毁游戏对象。该对象已订阅Gameover事件 void Awake () { Invoke ("_destroy", 1); GameMachine.Gameover += _destroy; } 销毁方法

我在Unity中编写代码,我发现有时调用函数可以调用方法,即使游戏对象已被销毁。 这就是为什么我添加了这个检查,它似乎工作正常,但它很奇怪

假设我有一个物体,我想在一秒钟内自我毁灭。 我在唤醒时添加一个调用来自我销毁它。 而且,如果游戏结束,我想立即销毁游戏对象。该对象已订阅Gameover事件

    void Awake ()
    {
    Invoke ("_destroy", 1);
    GameMachine.Gameover += _destroy;
    }
销毁方法如下所示:

    void _destroy()
    {
    if (!this) {
            return;
    }
    GameMachine.Gameover -= _destroy;
    Destroy (this.gameObject);
}
我添加了if(!this)检查,因为我发现调用可以到达_destroy方法,即使对象已经被game over事件破坏。 这是有道理的,有可能发生吗


谢谢

据我所知,它会起作用,但是,这样做不是一个好主意。 Unity的操作将覆盖操作符。因此,当您检查

!this
您正在检查对象(以及脚本)是否存在

另外,如果要取消订阅事件,请使用该函数。代码示例

void OnDisable () {
    GameMachine.Gameover -= _destroy;
}

回答标题中提出的问题:
如果(!this)
在C#中通常没有编译或意义。然而,Unity的
对象
类支持一个检查对象是否已被销毁的类。谢谢Michael Liu。这意味着,如果代码在非单行为类中,它甚至不会编译?这是正确的(当然,除非该类也支持到
bool
的转换)。隐式类型转换的使用多么可怕啊。您是否可以查看其他属性(例如,
if(!base.destromed)
只是为了让其他人在阅读你的代码时不会感到困惑?谢谢,文卡特。我想
!这个
检查是否存在单一行为,如果游戏对象不存在就不会
!这个.gameObject
?这句话很好。是的,
!这个.gameObject
会检查游戏对象是否存在。但是,因为你正在调用一个特定单行为中的函数,该脚本必须存在,否则调用将失败。因此,检查脚本是更符合逻辑的方法。