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