如果(!这个)返回; 在 C# 中有意义吗?

Posted

技术标签:

【中文标题】如果(!这个)返回; 在 C# 中有意义吗?【英文标题】:if (!this) return; makes sense in C#?如果(!这个)返回; 在 C# 中有意义吗? 【发布时间】:2016-06-18 23:24:42 【问题描述】:

我正在使用 Unity 进行编码,我发现有时即使游戏对象已被销毁,也可以通过 Invoke 函数调用方法。 这就是我添加此检查的原因,它似乎可以正常工作,但很奇怪。

假设我有一个我想在一秒钟内自行销毁的对象。 我在唤醒时添加了一个 Invoke 以自我摧毁它。 而且,如果游戏结束,我想立即销毁游戏对象。该对象订阅了 Gameover 事件。

    void Awake ()
    
    Invoke ("_destroy", 1);
    GameMachine.Gameover += _destroy;
    

_destroy 方法是这样的:

    void _destroy()
    
    if (!this) 
            return;
    
    GameMachine.Gameover -= _destroy;
    Destroy (this.gameObject);

我添加了 if (!this) 检查,因为我发现 Invoke 可以到达 _destroy 方法,即使对象已经被游戏结束事件销毁。 这有什么意义,有可能发生吗?

谢谢

【问题讨论】:

回答标题中提出的问题:if (!this) 通常在 C# 中无法编译或没有意义。然而,Unity 的 Object 类支持 implicit conversion to bool 来检查对象是否已被销毁。 谢谢迈克尔刘。这意味着如果该代码位于非 MonoBehaviour 类中,它甚至无法编译? 没错(当然,除非该类也支持转换为bool)。 隐式类型转换的使用太可怕了。您是否可以查看其他属性(例如if(!base.destroyed),以便其他人阅读您的代码时不会感到困惑? 【参考方案1】:

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

!this

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

附带说明,如果您想取消订阅事件,请改用OnDisable 函数。代码示例

void OnDisable () 
    GameMachine.Gameover -= _destroy;

【讨论】:

谢谢,文卡特。我认为!this 检查 Monobehaviour 是否存在,如果游戏对象存在不会是!this.gameObject? OnDisable 注释很好。 是的,!this.gameObject 确实会检查 GameObject 是否存在。但是,由于您在特定的 Monobehaviour 中调用函数,因此该脚本必须存在,否则调用将失败。因此,检查脚本是解决此问题的更合乎逻辑的方式。

以上是关于如果(!这个)返回; 在 C# 中有意义吗?的主要内容,如果未能解决你的问题,请参考以下文章

C# 私有属性 - 它们被使用/有意义吗?

在 docker 中运行 c# worker 服务有意义吗?

这个 Python 表达式有意义吗?

对动态内存进行操作,重写一个const成员函数有意义吗?

每月拿几百元来买基金,有意义吗?

是否hreflang attr。在 <base> 中有意义吗?