如果(!这个)返回; 在 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# 中有意义吗?的主要内容,如果未能解决你的问题,请参考以下文章