13.Unity立即删除对象后不同判空的打印结果

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”,所以进入了 AC 分支。
  • go is null(System.Object)go == null 是 C# 层面的真实引用判断,由于 go 并未置为 null,判断为 false。

13.4 关键词联想

  • Unity 对象销毁机制
  • UnityEngine.Object 运算符重载
  • DestroyImmediate 与变量引用
  • == null vs is null vs 强转判断
  • Unity 空引用判断陷阱
  • 空对象判断最佳实践


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏