用 == null 判断引用类型最安全,因默认调用 referenceequals;int? 等可空类型可用 == null 或 hasvalue;慎用装箱拆箱避免 invalidcastexception。
直接用 == null 判断引用类型最安全
对引用类型(如 string、object、自定义类实例),== 运算符默认调用 ReferenceEquals,能准确识别是否为 null。这是最常用也最不易出错的方式。
- 不要用
.Equals(null)—— 会抛NullReferenceException - 避免重载了
==的自定义类型(极少见),此时应优先查文档或改用ReferenceEquals(obj, null) -
string是特例:它重载了==,但行为仍符合预期("" == null为false),所以放心用
值类型不能为 null,但可空值类型(Nullable)要特殊处理
int、DateTime 等非泛型值类型永远不为 null,编译器甚至不允许写 int x = null;。但 int?(即 Nullable<int></int>)可以,判断方式不同:
- 用
obj == null对int?是合法且推荐的(编译器自动转换为HasValue == false) - 也可显式调用
obj.HasValue,语义更清晰,尤其在复杂条件中 - 别用
obj == default(int?)—— 虽然结果相同,但可读性差,且容易和默认值逻辑混淆
使用 ?? 和 ?. 避免重复判空
频繁判空时,C# 提供了更简洁的语法,本质仍是基于 null 判断,但大幅减少样板代码: