首页 > 代码库 > C# ?? 运算符,不能忘记的知识点
C# ?? 运算符,不能忘记的知识点
最近项目中有一个bug被测试(是黑盒测试)发现了,跟了老半天代码,才找到这个问题的所在,原来是一个计算表达式中用到了??运算符,才导致了这个错误,下面让我简单讲述一下。
C# ?? 运算符 msdn上的定义如下:
C#中的?? 运算符称为 null 合并运算符,用于定义可以为 null 值的类型和引用类型的默认值。 如果此运算符的左操作数不为 null,则此运算符将返回左操作数;否则返回右操作数。
这句话的意思很好理解,比如:
?
1 2 | int ? x = null ; int y = x ?? -1; |
那么y的值就是-1,这是很好理解的。
下面看一下这段代码的结果:
?
1 2 | int ? a = null ; int b = 12 - a ?? 1; |
猜猜b的值是多少,或者很多人都会说是11,但是很遗憾的告诉你们不是,b的值是1(其实我想要的值也是11)。
这时候可能有人会想是不是??运算符的优先给高于“-”,这样想就错了(开始我也是这么认为的)。
那么再看下下面的这段代码的结果:
?
1 2 3 | int ? a = null ; a = 2; int b = 12 - a ?? 1; |
这段代码b的值又是多少呢,这时候b的值是10。
你是不是有一点疑惑了,是不是不大理解了,其实我们可以这样理解:无论在单个变量或是一个运算表达式中(包含复杂的四则运算)如果有运算符??,如果??运算符左边的操作数为null,则变量(或整个表达式)的结果则是右操作数;否则是正常运算的结果。
在开发中,这样的小疏忽就很可能会产生很大的bug,那么我们怎样避免这的问题呢?方法也是很简单的,就是在有??运算符的外面加上一个"()"这样就会得到我们想要的计算结果了。代码如下:
?
1 2 | int ? a = null ; int b =12 - (a ?? 1); |
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。