13.Unity立即删除对象后不同判空的打印结果
13.1 题目
string s = string.Empty;
GameObject go = new GameObject();
DestroyImmediate(go);
if (!go)
s += "A";
if (go is null)
s += "B";
if (go == null)
s += "C";
if ((System.Object)go == null)
s += "D";
Debug.Log(s);
请问最终打印的 s 的结果为?
13.2 深入解析
答案:AC
核心考点
这个题目考察的是 Unity 对象销毁后与 null 判断相关的运算符重载机制,理解重点在于:
DestroyImmediate 的行为
DestroyImmediate(go)会立刻销毁该对象在 Unity 引擎层的存在。- 但
go变量仍然持有原引用,并不是 C# 层真正意义上的null。
Unity 对 ==、!=、! 运算符进行了重载
Unity 为了让开发者判断对象是否被销毁时更直观,重载了 == 和 ! 运算符:
if (!go)→ 会调用 Unity 重载的逻辑判断,被销毁的对象会被视为 null,因此s += "A"。if (go == null)→ 同样是 Unity 重载,会返回 true,因此s += "C"。if (go is null)→ 是 C# 原生语义判断,此时go仍持有非 null 引用,返回 false。if ((System.Object)go == null)→ 通过强转绕过 Unity 的重载逻辑,同样是标准引用比较,也为 false。
示例补充说明
if (!go) // ✅ true,Unity重载的逻辑非
if (go == null) // ✅ true,Unity重载的比较
if (go is null) // ❌ false,C# 原生语义判断
if ((System.Object)go == null) // ❌ false,绕过重载,用C#引用判断
重点提示:虽然
go看起来“像 null”,但它本质上仍有引用,建议手动置为null避免误判。
13.3 答题示例
打印结果为
"AC"。原因如下:
DestroyImmediate(go)虽然销毁了对象,但变量go仍持有引用。- Unity 对
!和==运算符进行了重载,使其在对象被销毁后仍能判断为“null”,所以进入了A和C分支。- 而
go is null和(System.Object)go == null是 C# 层面的真实引用判断,由于go并未置为 null,判断为 false。
13.4 关键词联想
- Unity 对象销毁机制
- UnityEngine.Object 运算符重载
DestroyImmediate与变量引用== nullvsis nullvs 强转判断- Unity 空引用判断陷阱
- 空对象判断最佳实践
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com