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)删除。
用户投稿
上一篇 2022年6月27日 15:03
下一篇 2022年6月27日 15:03

相关推荐

  • 客服的岗位职责怎么写(客服工作内容及职责)

    各位小伙伴们大家周一好,又到了每周一给大家分享干货内容的时候啦~ 本期来跟大家分享一下客服工作管理流程以及客服岗位里面的每项职能岗位的核心细则,也是干货满满推荐收藏~ 一.补偿流程…

    2022年11月25日
  • 淘宝直播开通后带货链接怎么做(淘宝直播需要开通淘宝店铺吗)

    直播带货无论是对于商家来说还是主播收益都是非常可观的,所以不少平台都有直播带货功能,一些小伙伴也想加入淘宝直播,那么淘宝直播开通后带货链接怎么做?下面小编为大家带来淘宝直播开通后带…

    2022年11月24日
  • 小红书入驻条件及费用(小红书开店)

    小红书喊你回家开店! 有不少用户都发现,最近在逛小红书的时候,笔记上面多出了一个图片标签,点进入之后便可进入下单页面,还可以通过商品页面找到相关店铺,大大缩短了交易路径。 “很方便…

    2022年11月23日
  • 快手限流多久能解除(快手限流什么意思)

    我相信很多人都看中了快手平台的商机,都争先恐后地想要抢占机会,可一些人刚刚作出一点成绩,就被降权了,自己也不知道什么原因。所以今天就来聊聊快手账号降权操作分享,赶快来看看避免违规!…

    2022年11月23日
  • Win11 22H2再出新问题Bug:无法弹出USB设备

    作为Windows 11的首次大更新,在Win11 22H2发布后并没有带来预想的场景,各种问题频现成为了一种常态。 近日有消息称,Win11 22H2存在一个占用冲突Bug,当用…

    2022年11月22日
  • 重庆高风险区一般多长时间解除(重庆成都是高风险区吗)

    重庆这几天的疫情新增情况也是比较严重的,大家对近期的重庆疫情防控措施也都十分关注,据悉目前重庆还存在不少的疫情高风险地区。那么,重庆高风险区一般多长时间解除?对于高风险地区解封时间…

    2022年11月21日
  • 面包车加入货拉拉有什么条件(面包车拉货平台)

    现在大家可以看到各种货拉拉的车在大街小巷穿梭,同城配送都会选择货拉拉搬运,其中面包车是非常常见的一种,一些小伙伴也想加入货拉拉赚钱,那么面包车加入货拉拉有什么条件?下面小编为大家带…

    2022年11月21日
  • 马斯克凌晨一点半晒“代码审查”现场,编排他的段子比疯狂星期四还多

    梦晨 Pine 发自 凹非寺 量子位 | 公众号 QbitAI 每一个真正会写代码的人,请在下午2点到总部10层报到。 每一个真正会写代码的人,请在下午2点到总部10层报到。 马斯…

    2022年11月21日
  • 美团月付300小额取现?美团月付取现300不见了

    很多上班族每天都在使用美团点外卖,你知道美团现在推出了一款类似花呗的产品吗?可以在美团消费的时候先消费后还款,叫做美团月付,是美团推出的一款消费型产品,不能直接提现到银行卡,只能用…

    2022年11月21日
  • wish个人开店流程及费用(wish平台入驻条件)

    随着电商行业的发展,不少国内卖家转战国外,可以说知名不知名的电商平台都有了中国卖家的身影,wish也不例外,今天我们就来说说wish平台入驻条件,让大家有备无患。 想要在一个平台上…

    2022年11月21日

联系我们

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