自定义的==运算符,我们应该保留吗?
该文章译自Unity官网博客,原文:Custom == operator, should we keep it?
TL;DR: Unity的
==
是魔改版,与原生C#里的行为不一样。所以不要对UnityEngine.Object
派生出的任何东西(包括MonoBehaviour
)使用C#的空值相关语法糖,包括?.
,??
,??=
等等(三元运算符可以用),而应该老老实实使用== null
来判空。
¶正文
当你在Unity中进行这样的操作时:
1 | if (myGameObject == null) |
Unity对==
运算符做了一些特殊处理。与大多数人所期望的不同,我们对==
运算符有一个特殊实现。
这样做是为了达到两个目的:
- 当一个
MonoBehaviour
有字段时,仅仅在编辑器中1,我们不会将这些字段设置为“真null”,而是设置为一个“假null”对象。我们自定义的==
操作符能够检查某物是否是这种假null,并采取相应的行为。虽然这种机制怪怪的,但它能让我们在假null中存储信息,这样当你对它调用一个方法,或者读取一个属性时,它可以给你更多的上下文信息。如果没有这个技巧,你只会得到一个NullReferenceException
,一个堆栈跟踪,但你不知道到底哪个GameObject
的MonoBehaviour
的字段是空的。而有了这个技巧,我们就可以在检查器中突出显示GameObject
,也可以给你更多的提示:“看起来你正在访问这个MonoBehaviour
中的一个未初始化的字段,请用Inspector将这个字段指向某个东西”。