Unity 判空重载学习⚓︎
在使用 Unity
相关的对象时候,使用 !=
和 ==
判断对象是否为空,尽量避免使用纯 C# 判空的方式,比如 ReferenceEquals()
,也不能使用 ??
和 ?.
。
在 Unity 中,一个 Unity 对象 (如 GameObject、Component) 可能在内存中仍然存在引用,但在 Unity 引擎的管理体系下已经被销毁。如果使用纯 C# 的 ReferenceEquals()
方法来判断,由于内存中的引用依然存在,会得到对象不为空的结果,但此时对该对象进行操作,往往会引发 NullReferenceException
异常,导致程序崩溃。而 Unity 重载后的 ==
和 !=
操作符,会考虑到 Unity 引擎内部的对象状态管理,能够准确判断对象在 Unity 环境下是否已经 “失效” ,即是否可以安全使用。
GameObject myGameObject = GameObject.Find("MyObject");
// 销毁对象
Destroy(myGameObject);
// 使用Unity重载的==判断
if (myGameObject == null)
{
Debug.Log("对象已在Unity中失效");
}
// 使用纯 C# 的 ReferenceEquals 判断
if (ReferenceEquals(myGameObject, null))
{
// 此时可能不为 null
Debug.Log("该判断在这种情况下不准确");
}