You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity自定义null与C#原生null:==判断失效问题排查

解决Unity "假null"与C#原生null的通用判断问题

Unity中UnityEngine.Object的子类对象被销毁后,若未被GC回收,会成为所谓的"假null"——实际引用仍存在内存中,但Unity重载的==运算符会返回true。但当你在约束为class的泛型TRefType中使用==判断时,会绑定C#原生的引用相等逻辑,导致明明是Unity假null却返回false,这就是核心问题。

通用判断方案

以下是兼容两种null的通用判断方法,同时覆盖原生null和Unity假null场景:

public static bool IsNull<TRefType>(TRefType obj) where TRefType : class
{
    // 先判断C#原生null(真正的引用为空)
    if (object.ReferenceEquals(obj, null))
        return true;

    // 若对象是UnityEngine.Object子类,用Unity的重载逻辑判断假null
    if (obj is UnityEngine.Object unityObj)
        return unityObj == null;

    // 非Unity对象且已排除原生null,返回false
    return false;
}

逻辑说明

  1. 原生null判断:用object.ReferenceEquals直接检查引用是否真正为空,这是最底层的null判断,不受任何运算符重载影响。
  2. Unity假null判断:通过类型转换判断对象是否属于UnityEngine.Object体系,若是则调用Unity重载的==运算符,该运算符会内部检查对象是否已被销毁,正确识别假null。
  3. 普通C#类兼容:对于非Unity的普通引用类型,只要过了第一步的原生null判断,就说明引用有效,直接返回false。

简化替代写法

如果你的泛型场景主要针对Unity对象,但仍需兼容普通类,也可以用更简洁的方式:

public static bool IsNull<TRefType>(TRefType obj) where TRefType : class
{
    return obj == null || (obj is UnityEngine.Object unityObj && unityObj == null);
}

这种写法中,obj == null先触发原生判断,若为true直接返回;否则再检查是否是Unity假null。

内容的提问来源于stack exchange,提问作者Spring E. Thing

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 19:35:01