📜  用于空值的空值检查运算符 - C# (1)

📅  最后修改于: 2023-12-03 14:56:22.065000             🧑  作者: Mango

用于空值的空值检查运算符 - C#

简介

在 C# 中,我们经常需要处理空值。为了提高代码的可读性和简化空值检查的操作,C# 引入了用于空值的空值检查运算符(Null-conditional operators),也称为安全导航运算符或 Elvis 运算符。这些运算符允许我们在访问潜在为空的对象的属性或调用潜在为空的委托时进行空值检查,并避免抛出 NullReferenceException。

空值检查运算符 - ?. 和 ?[]

空值检查运算符由问号(?)和句点(.)组成,称为 "?.",或者它可以与索引操作符([])组合成 "?[]",这两种运算符具有相同的行为。空值检查运算符的语法如下:

object?.Member
object?.Method()
object?[]

当对象为 null 时,空值检查运算符将返回 null,而不会引发 NullReferenceException。如果对象不为空时,会正常地访问对应的成员或调用对应的方法。

使用空值检查运算符的示例:

string name = null;
int? length = name?.Length;

Console.WriteLine(length);  // 输出:null

在上面的示例中,当 name 为 null 时,使用空值检查运算符获取 Length 属性值会返回 null。

null 合并运算符 - ??

空值检查运算符与 null 合并运算符一起使用,可以在属性或方法调用返回 null 时,提供一个默认值。null 合并运算符的语法如下:

object ?? defaultValue

当对象为 null 时,空值检查运算符结合 null 合并运算符会返回给定的 defaultValue。如果对象不为空时,会正常地返回对应的成员或方法调用的结果。

使用空值检查运算符和 null 合并运算符的示例:

string name = null;
string greeting = "Hello " + (name ?? "Unknown");

Console.WriteLine(greeting);  // 输出:Hello Unknown

在上面的示例中,当 name 为 null 时,使用空值检查运算符获取 name 并与字符串 "Hello " 相连接,然后通过 null 合并运算符提供默认值 "Unknown"。

空值条件表达式 - ?:

空值条件表达式与空值检查运算符和 null 合并运算符类似,它允许我们在属性或方法调用返回 null 时,执行不同的代码逻辑。空值条件表达式的语法如下:

object?.Member ?? (expression)

当对象为 null 时,将执行表达式 expression,否则将正常地返回对应的成员或方法调用的结果。

使用空值条件表达式的示例:

int? length = "Hello World".Length > 10 ? "Hello World".Length : (int?)null;

Console.WriteLine(length);  // 输出:null

在上面的示例中,当字符串的长度大于 10 时,空值条件表达式返回字符串的长度,否则返回 null。

数组的空值检查

我们还可以使用空值检查运算符来检查数组元素是否为 null。在访问数组元素之前,我们可以使用空值检查运算符来判断数组是否为 null,如果不为 null,则可以继续访问对应的元素。数组的空值检查运算符的语法如下:

array?[index]

当数组为 null 时,空值检查运算符将返回 null;当数组不为 null,但索引超出数组范围时,空值检查运算符将返回数组类型的默认值。

使用数组的空值检查运算符的示例:

string[] names = null;
string firstName = names?[0];

Console.WriteLine(firstName);  // 输出:null

在上面的示例中,由于 names 数组为 null,使用空值检查运算符来获取 names 数组的第一个元素将返回 null。

总结

在 C# 中,空值检查运算符使得处理空值变得简单且可读性更高。我们可以使用空值检查运算符 ?. 来安全地访问潜在为空的对象的属性或调用方法,并使用 null 合并运算符 ?? 提供默认值。空值条件表达式 ?.?? 的结合使用允许我们在处理空值时执行不同的代码逻辑。此外,还可以使用空值检查运算符 ?[] 来检查数组元素是否为 null。