【问题标题】: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),以便其他人阅读您的代码时不会感到困惑?

标签: c# events unity3d destroy


【解决方案1】:

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

!this

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

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

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

【讨论】:

  • 谢谢,文卡特。我认为!this 检查 Monobehaviour 是否存在,如果游戏对象存在不会是!this.gameObject? OnDisable 注释很好。
  • 是的,!this.gameObject 确实会检查 GameObject 是否存在。但是,由于您在特定的 Monobehaviour 中调用函数,因此该脚本必须存在,否则调用将失败。因此,检查脚本是解决此问题的更合乎逻辑的方式。
猜你喜欢
  • 1970-01-01
  • 2010-11-13
  • 2010-10-31
  • 2010-10-09
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
相关资源
最近更新 更多