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,提问作者陽品駒
相关产品推荐
相关产品推荐

