![C# 10核心技术指南](https://wfqqreader-1252317822.image.myqcloud.com/cover/89/52513089/b_52513089.jpg)
2.10 null运算符
C#提供了三个简化null处理的运算符:null合并运算符、null合并赋值运算符和null条件运算符。
2.10.1 null合并运算符
null合并运算符写作??。它的意思是“如果左侧操作数不是null,则结果为操作数;否则结果为另一个值。”例如:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0093-01.jpg?sign=1738806242-vb3ab9vFF8o0B3DPdibBXrlsE1OkDahe-0-ac8f491f3da1fb3f7ff83cc95eb78abe)
如果左侧的表达式不是null,则右侧的表达式将不会进行计算。null合并运算符同样适用于可空值类型(请参见4.7节)。
2.10.2 null合并赋值运算符
null合并赋值运算符(C# 8引入)写作??==。它的含义是“如果左侧操作数为null,则将右侧的操作数赋值给左侧的操作数。”请考虑以下示例:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0093-02.jpg?sign=1738806242-yGpzv9ZFrolqdv139Zcj5g7bweg5fjLd-0-2560ed77f0bc2133cc7497b47ff53ed0)
以上代码等价于:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0093-03.jpg?sign=1738806242-D9pMVLXtGRguJCyKOdnjCMYZA9TR7T2q-0-17c9af9042c3b05f81a4102e5730ecf8)
??=运算符可以用于实现延迟计算属性,我们将在4.12.5节中介绍。
2.10.3 null条件运算符
?.运算符称为null条件运算符或者Elvis运算符(从Elvis表情符号而来),该运算符可以像标准的.运算符那样访问成员或调用方法。当运算符的左侧为null时,该表达式的运算结果也是null而不会抛出NullReferenceException异常。
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0093-04.jpg?sign=1738806242-W2rEGJQQKDgHaLxuPJmEJZYx6mSq94QO-0-cbb77388afe97ba3dd620dce43b96e98)
上述代码的最后一行等价于:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0093-05.jpg?sign=1738806242-eSsxvqKgdamti72KAUmEbBpVU2JVkXfa-0-0bb9aec25fd72d31b9e68ea05b48d35a)
null条件运算符同样适用于索引器:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0093-06.jpg?sign=1738806242-RlR26sGqM9jINimPJOiFEwG9Yp0YqlxD-0-b33dea5a9419f7f3a10771ff14f29897)
当遇到null时,Elvis运算符将直接略过表达式的其余部分。在接下来的例子中,即使ToString()和ToUpper()方法使用的是标准的.运算符,s的值仍然为null。
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0094-01.jpg?sign=1738806242-xxVgZdZVAe0EJppHu0JBhlT5MUyIbb3s-0-a70e9239e007525f30f7d5eb84f27ddf)
只有直接的左侧运算数可能为null时才有必要重复使用Elvis运算符。因此以下表达式在x和y都为null时依然是健壮的:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0094-02.jpg?sign=1738806242-PFwAG7YSxojiY0tnAaenOIDREqgbxMcP-0-1ad3467cb62d2050e3fc7ed360f140ae)
它等价于(唯一的不同在于x.y仅执行了一次):
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0094-03.jpg?sign=1738806242-MfV3U3WJ0iH7gjxPvbZ1Lw86kRlAsE8S-0-084ef935015469f1b3da0fdefa36b668)
需要指出,最终的表达式必须能够处理null,因此以下的范例是非法的:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0094-04.jpg?sign=1738806242-Sl0nLTiEk7CbER0opEyeQTJFWbWUyLFo-0-3b90209272cae7f956b03fd197118b86)
我们可以使用可空值类型(请参见4.7节)来修正这个问题。如果你已经对可空值类型有所了解,请参见以下范例代码:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0094-05.jpg?sign=1738806242-VztUf51kLuPxOsaRn2MQM4oHuJygvgrG-0-473a0bdfff6873b45a627df4c92685cd)
我们也可以使用null条件运算符调用返回值为void的方法:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0094-06.jpg?sign=1738806242-lxP86XlYje98pXZRitivqYLbPBTiAZpC-0-a65fdcf17e3d1b7d8cc1d546f3588bf7)
如果someObject为null,则表达式将“不执行指令”而不会抛出NullReferenceException异常。
null条件运算符可以和第3章介绍的常用类型成员一起使用,包括方法、字段、属性和索引器。而且它也可以和null合并运算符配合使用:
![](https://epubservercos.yuewen.com/77D764/31147986804769406/epubprivate/OEBPS/Images/0094-07.jpg?sign=1738806242-f7mFLV0iRzuMBE7yuUEWubSXxIIt3fg1-0-3daef539aa42c63cfcfe8a5ff965e462)