C# 空条件运算符 ?.
在C#编程中,NullReferenceException 可能是最常见的运行时异常之一。传统的空值检查需要大量冗余的 if 语句,使代码变得冗长且难以阅读。C# 6.0 引入的空条件运算符 ?. 彻底改变了这一局面,让空值检查变得简洁而优雅。
1 基础语法
空条件运算符 ?. 的语法非常简单:对象?.成员
string name = person?.Name; // 如果person为null,则name为null,不会抛出异常
2 工作原理
当编译器遇到 obj?.Property 时,它会生成等效的检查代码:
// 编译器将 obj?.Property 转换为:
var result = (obj != null) ? obj.Property : null;
3 常见用法场景
3.1 安全访问对象成员
// 传统方式
string street = null;
if (address != null && address.Street != null)
{
street = address.Street;
}
// 使用 ?. 方式
string street = address?.Street;
3.2 链式调用
// 安全访问深层嵌套属性
var cityName = order?.Customer?.Address?.City;
// 等效的传统写法
string cityName = null;
if (order != null &&
order.Customer != null &&
order.Customer.Address != null)
{
cityName = order.Customer.Address.City;
}
4 重要注意事项
4.1 返回值类型
- 当访问值类型成员时,
?.返回该类型的可空版本(Nullable) int? age = person?.Age; // 注意:age是int?而不是int
4.2 短路求值
?. 具有短路特性:一旦链中的某个部分为 null,整个表达式立即返回 null,不再计算后续部分
// 如果order为null,不会计算Customer.Address.City
var city = order?.Customer?.Address?.City;
4.3 不能用于赋值
// 这是错误的!
person?.Name = "John"; // 编译错误
// 正确的做法
if (person != null)
{
person.Name = "John";
}
5 最佳实践
- 适度使用:不要过度使用链式
?.,过长的链可能表明设计问题 - 结合 ?? 使用:通常与空合并运算符结合使用,提供默认值
- 注意可读性:当链过长时,考虑重构代码或使用临时变量
- 用于事件调用:这是调用事件的标准安全方式
留下评论