zoukankan      html  css  js  c++  java
  • C# ?? 运算符,不能忘记的知识点

      最近项目中有一个bug被测试(是黑盒测试)发现了,跟了老半天代码,才找到这个问题的所在,原来是一个计算表达式中用到了??运算符,才导致了这个错误,下面让我简单讲述一下。

      C# ?? 运算符 msdn上的定义如下:

    C#中的?? 运算符称为 null 合并运算符,用于定义可以为 null 值的类型和引用类型的默认值。 如果此运算符的左操作数不为 null,则此运算符将返回左操作数;否则返回右操作数。

    这句话的意思很好理解,比如:

    int? x = null;
    int y = x ?? -1;

    那么y的值就是-1,这是很好理解的。

      下面看一下这段代码的结果:

    int? a = null;
    int b = 12 - a ?? 1;

     猜猜b的值是多少,或者很多人都会说是11,但是很遗憾的告诉你们不是,b的值是1(其实我想要的值也是11)。

    这时候可能有人会想是不是??运算符的优先级高于“-”,这样想就错了(开始我也是这么认为的)。

      那么再看下下面的这段代码的结果:

    int? a = null;
    a = 2;
    int b = 12 - a ?? 1;

    这段代码b的值又是多少呢,这时候b的值是10。

      你是不是有一点疑惑了,是不是不大理解了,其实我们可以这样理解:无论在单个变量或是一个运算表达式中(包含复杂的四则运算)如果有运算符??,如果??运算符左边的操作数为null,则变量(或整个表达式)的结果则是右操作数;否则是正常运算的结果。

      在开发中,这样的小疏忽就很可能会产生很大的bug,那么我们怎样避免这的问题呢?方法也是很简单的,就是在有??运算符的外面加上一个"()"这样就会得到我们想要的计算结果了。代码如下:

                int? a = null;
                int b =12 - (a ?? 1);
  • 相关阅读:
    递归
    二叉树
    IIs 网站应用程序与虚拟目录的区别及高级应用说明(文件分布式存储方案)
    Python时间,日期,时间戳之间转换
    jquery 时间戳和日期时间转化
    javascript 中解析json
    设计模式之单例模式
    深入理解DIP、IoC、DI以及IoC容器
    《大型网站技术架构》读书笔记一:大型网站架构演化
    Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作
  • 原文地址:https://www.cnblogs.com/junjieok/p/3766677.html
Copyright © 2011-2022 走看看