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

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

大家好,欢迎来到IT知识分享网。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 ,则返回 str1str2str3 不再求值;否则继续求 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];

上述代码中,若 strnull,则 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)

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/13066.html

(0)
上一篇 2024-03-08 21:00
下一篇 2024-03-08 21:26

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信