C#怎么判断对象是否为空_C#如何防止NullReferenceException异常【指南】

张开发
2026/4/8 2:15:23 15 分钟阅读

分享文章

C#怎么判断对象是否为空_C#如何防止NullReferenceException异常【指南】
p判断对象是否为 null 用 null 就够了C# 中引用类型默认支持该写法简洁安全可空值类型同样适用字符串应优先用 string.IsNullOrEmpty启用 nullable 引用类型并配合 ArgumentNullException.ThrowIfNull 等手段可系统性防控空引用异常。/p判断对象是否为 null 用 null 就够了绝大多数情况下null 检查只需要一行 if (obj null)。C# 的 运算符对引用类型默认就是引用相等性比较和 ReferenceEquals(obj, null) 行为一致且更简洁、可读性更好。别用 obj.Equals(null) —— 这会直接抛出 NullReferenceException也别绕路写 object.ReferenceEquals(obj, null)除非你在写底层框架或需要明确语义的极端场景。值类型如 int、DateTime不能为 null但可空值类型int?、DateTime?可以用 null 安全判断字符串是引用类型string.IsNullOrEmpty(s) 是语义检查不是 null 判定替代方案它内部第一行就是 s null自定义类型重载了 运算符只要没改 null 比较逻辑极少见obj null 依然安全开启 nullable 引用类型后编译器能提前拦住大部分空引用这是 C# 8.0 起最有效的预防手段。启用后编译器会把未标注可空性的引用类型如 string、MyClass当作「不应为 null」来静态分析并在可能赋 null 或解引用前报警告CS8602、CS8600 等。关键不是“加了就万事大吉”而是要配合项目配置和渐进式迁移在 .csproj 中添加 Nullableenable/Nullable已有代码会大量报黄线——先用 ! 后缀断言如 obj!.ToString()但这是临时止血不是修复真正修复是补上 ? 标注如把参数改成 string? name再补运行时检查第三方库若没标注 nullable编译器会按“宽松模式”处理此时仍需手动防护避免在属性 getter 里隐式触发 NullReferenceException常见陷阱把空检查写在 setter却在 getter 里直接访问子成员。比如 public string Name _person.Name;而 _person 是 null —— 这个 getter 一调就崩且堆栈不提示源头。正确做法是让 getter 自包含防御逻辑尤其当字段/属性本身可能未初始化时用空合并运算符public string Name _person?.Name ?? string.Empty;或显式判空public string Name _person is null ? string.Empty : _person.Name;如果业务上 _person 必须非空那就该在构造或 setter 里强制校验而不是把风险甩给 getter不要依赖 IDE 自动生成的属性模板如 prop它们默认不带空安全逻辑用 ArgumentNullException.ThrowIfNull() 替代手写 if-throw.NET 6 提供了标准、高效的空参数校验方式ArgumentNullException.ThrowIfNull(obj, nameof(obj))。它比传统写法更轻量无异常对象分配开销、语义更清晰且被 JIT 优化过。注意它只适用于 public 方法的参数校验场景别在 private 方法或内部逻辑里滥用——那里更适合用 Debug.Assert 或直接 if (obj null) throw ...旧项目升级时逐个替换 if (obj null) throw new ArgumentNullException(...) 即可行为完全一致如果目标框架低于 .NET 6可用 Guard.Against.Null(obj, nameof(obj))如使用 Microsoft.Toolkit.Extensions但优先升级框架这个方法不解决“对象内部字段为空”的问题只管入参本身空引用的本质从来不是语法问题而是控制流没覆盖到的分支、契约没声明清楚的接口、或者初始化顺序被忽略的时机。编译器提示、统一校验入口、getter 防御意识——这三块漏掉任何一块都可能让 NullReferenceException 在深夜三点弹出来提醒你。

更多文章