C# 中的空合和空条件运算符

C# 语言对空值NULL的处理提供了一整套机制和相应的语法糖,包优雅而强大,个人感觉,大概也是所有编程语言中NULL处理机制最完善的。

空合操作

string name = GetName() ?? “张三”;

空合操作符的运算规则是:若左侧表达式求值后不为 null,则立即返回左侧表达式值,右侧表达式求值运算不再执行;否则,对右侧表达式求值并返回。因此,上述代码实际上等价于:

string? temp = GetName(); string name = temp != null ? temp : “张三”;

空合运算符对于可空值类型(Nullable Value Types)同样适用。

int? i1 = 1; var i2 = i1 ?? 100;

上面代码中,可空值类型 i1 的值不为 null ,因此 i2 的值为 1。若 i1== null,则 i2 的值为100。因为最终运算结果不会包含 null 值,因此 i2 的类型被编译器推断为 int 而不是 int? 。代码实际上等价于:

int? i1 = 1; var i2 = i1 != null ? i1.Value : 100;

空合操作符最神奇的地方是可以无限连接使用。

string str = str1 ?? str2 ?? str3 ?? “默认值”;

上面的代码中,若 str1 不为 null ,则返回 str1 ,str2 和 str3 不再求值;否则继续求 str2 值,若 str2 值不为 null,返回 str2 值,str3 不再求值。若 str2 值为 null,则继续求 str3 值,若 str3 值不为 null,返回 str3 值,否则返回默认值。如果转换成三元操作符,等价于:

string str = str1 != null ? str1 : (str2 != null ? str2 : (str3 != null ? str3 : “默认值”));

若转换成 if 语句,则更加繁琐:

if(str1 != null) { str = str1; } else if (str2 != null) { str = str2; } else if(str3 != null) { str = str3; } else str = “默认值”;

还有一个超级方便的空合赋值操作符。

name ??= “张三”;

即当 name 的值为 null 时,自动赋值右侧表达式的值,等价于:

if (name == null) { name = “张三”; }

条件运算符

空条件运算符的形式是 A?.B,即当 A == null 时,表达式值为 null。否则,就像正常的对象一样调用属性和方法。这样做的好处是可以避免在 A 为 null 时抛出 NullReferenceException 异常。

object? obj = null; var result = obj?.ToString();

上述代码实际上等价于:

object? obj = null; var result = obj == null ? null : obj.ToString();

因为结果可能为 null,因此 result 被编译器推断为 string? 而不是 string(开启 nullable 特性的情况下)。

空条件运算符还可用在索引上。

string? str = “一段字符串”; var c = str?[1];

上述代码中,若 str 为 null,则 c 的值为 null,否则按照正常索引取值,代码等价于:

string? str = “一段字符串”; char? c = str == null ? null : str[1];

需要注意的是,在索引运算上运用空条件运算符,并不检查索引的边界,因此若索引值超出序列的范围,会引发 IndexOutOfRangeException。

string? str = “一段字符串”; var c = str?[6]; // 运行时引发 IndexOutOfRangeException

空条件运算法同样可以多个结合在一起使用。

A?.B?.C

等价于以下代码:

A == null ? null : (A.B == null ? null : A.B.C)

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年6月27日
下一篇 2022年6月27日

相关推荐

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息