少于 1 分钟阅读 次阅读

在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 最佳实践

  1. 适度使用:不要过度使用链式 ?.,过长的链可能表明设计问题
  2. 结合 ?? 使用:通常与空合并运算符结合使用,提供默认值
  3. 注意可读性:当链过长时,考虑重构代码或使用临时变量
  4. 用于事件调用:这是调用事件的标准安全方式

标签:

分类:

更新时间:

留下评论