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

Unity C#中如何判断[Serializable]类对象是否为空?

解决标记[Serializable]类的空对象判断问题

问题原因

当类标记了[Serializable]特性后,编译器对未初始化的引用类型变量的处理会发生变化:它会生成一个空对象占位符(并非真正的null),导致myroutine != null的判断返回true,但这个占位对象并未完成初始化,访问其成员时就会触发空引用异常。而未标记Serializable时,未初始化的引用类型变量就是标准的null,判断逻辑可以正常工作。

可行解决方法

1. 明确初始化变量为null

声明变量时直接赋值为null,让判断逻辑回归正常:

void Somefunction()
{
    // 明确初始化为null
    ScheduledRoutine myroutine = null;
    if (myroutine != null)
    {
        // 处理非空对象
    }
    else
    {
        // 处理空对象
    }
}

2. 增加对象有效性检查方法

在ScheduledRoutine类中添加自定义的有效性判断方法,区分真正的有效对象和序列化生成的占位对象:

[Serializable]
public class ScheduledRoutine
{
    public int uid { get; private set; }
    public string TaskName = "";

    // 根据类的实际业务逻辑定义有效性规则
    public bool IsValid()
    {
        // 示例:以TaskName不为null作为有效判断条件,可根据需求调整
        return TaskName != null;
    }
}

使用时结合null检查和有效性判断:

void Somefunction()
{
    ScheduledRoutine myroutine;
    if (myroutine != null && myroutine.IsValid())
    {
        // 处理有效对象
    }
    else
    {
        // 处理空或无效对象
    }
}

3. 遵循C#最佳实践:避免未初始化的引用类型变量

在C#中,非unsafe代码里未初始化的引用类型变量本应触发编译错误,但序列化特性的特殊处理导致了异常情况。因此最佳实践是永远不要使用未初始化的引用类型变量,声明时要么赋值为null,要么直接实例化对象:

// 方式1:初始化为null
ScheduledRoutine myroutine = null;
// 方式2:直接实例化
ScheduledRoutine myroutine = new ScheduledRoutine();

内容的提问来源于stack exchange,提问作者陽品駒

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:55:09