11 空值条件运算符
C#中减少大量代码行的一个功能是空值条件运算符。生产环境中的大量代码行都会验证空值条件。访问作为方法参数传递的成员变量之前,需要检查它,以确定该变量的值是否为 null,否则会抛出一个 NullReferenceException 异常。.NET 设计准指定,代码不应该抛出这些类型的异常,应该检查空值条件。然而,很容易忘记这样的检查。下面的这个代码片段验证传递的参数 p 是否非空。如果它为空,方法就只是返回,而不会继续执行:.
public void ShowPerson(Person p)
{
if (p == null) return;
string firstName = p.FirstName;
//...
}
使用空值条件运算符访问 FirstName属性(p?.FirstName),当 p 为空时,就只返回null,而不继续执行表达式的右侧。
public void ShowPerson(Person p)
{
string firstName = p?.FirstName;
//...
}
使用空值条件运算符访问 int 类型的属性时,不能把结果直接分配给 int 类型,因为结果可以为空。解决这个问题的一种选择是把结果分配给可空的 int:
nt? age = p?.Age;
当然,要解决这个问题,也可以使用空合并运算符,定义另一个结果(例如0),以防止左边的结果为空:
int age1 = p?.Age ?? 0;
也可以结合多个空值条件运算符。下面访问 Person 对象的 Address 属性,这个属性又定义了 City 属性。Person 对象需要进行 null 检查,如果它不为空,Address 属性的结果也不为空:
Person p = GetPerson();
string city = null;
if (p != null && p.HomeAddress != null)
{
city = p.HomeAddress.City;
}
使用空值条件运算符时,代码会更简单:
string city = p?.HomeAddress?.City;
还可以把空值条件运算符用于数组。在下面的代码片段中,使用索引运算符访问值为null 的数组变量元素时,会抛出 NullReferenceException 异常:
int[] arr = null;
int x1 = arr[0];
当然,可以进行传统的 null 检查,以避免这个异常条件。更简单的版本是使用?[0]访问数组中的第一个元素。如果结果是 null,空合并运算符就返回 x1 变量的值:
int x1 = arr?[0] ?? 0;