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);

时间: 2024-11-04 20:00:39

C# ?? 运算符,不能忘记的知识点的相关文章

一些容易忘记的知识点

 sqlserver默认端口号为:1433 URL:"jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=dbname" DRIVERNAME:"com.microsoft.jdbc.sqlserver.SQLServerDriver"; MySQL 默认端口号为:3306 URL:jdbc:mysql://localhost:3306/test?user=root&password=&use

记录容易忘记的知识点(html 内容)

<xx 表文件名> 导入外部样式表 <link type="text/css" rel="stylesheet" href="xx.css"/> { link 标签定义文档与外部资源的关系. type:定义文档所用的MIME类型. rel:relationship的英文缩写. REL 属性用于定义链接的文件和HTML文档之间的关系.StyleSheet,的意思就是样式调用,REL=StyleSheet 指定一个固定或首选的

java比较容易忘记的知识点

1.java中的基本数据类型以及所占内存大小 (1)整形 byte 1字节 short 2字节 int 4字节 long 8字节 (2)浮点型 float 4字节 double 8字节 (3)字符类型 char 2字节(Unicode-16) (4)布尔类型 布尔类型boolean比较特殊,尽管Java虚拟机定义了boolean类型,但虚拟机对boolean类型的支持是有限的,没有为boolean值单独设计JVM指令.操作布尔值的表达式在编译之后,它使用的是JVM的int数据类型,也就是占用4个

关于print、input、三目运算符、关系运算符短路原则, 知识点整理

1.print函数: 函数原型:print(objects,sep,end,file,flush) objects:需要打印的数据,个数没有限制 sep:数据与数据之间的分隔符,默认为空格 end:j结束符号,会自动换行,end默认值为\n file:文件,数据要打印的位置,默认将数据输出到控制台上,也可以改变数据输出位置 flush:刷新数流,结合file使用,为布尔值,需要刷新时候改为True 用法: username = 'abc' age = 18 sex = "Man" pr

python重要知识点(不断更新)

Python简洁优雅,库丰富而强大,特别是在数据分析领域,有着重要的地位. 下面是我学习中总结的一些重要,容易忘记的知识点 一.Python是如何进行内存管理的? 先说明一点,Python每创建一个对象,这个对象都是一个三元组(标识,类型,值).当我们调用一个对象时一般是按引用传递, 有必要时才按值传递.(按引用不新建对象,按值则会新建对象) 1.引用计数机制 创建对象后,每分配一个名称或将对象放入一个容器时,该对象的引用计数都会增加: 每del一个名称或者引用超出作用域或者被重新赋值时,该对象

总结:任务、线程和同步

近期又看了一遍<C#高级编程>这本书,想对书中--任务.线程和同步这一章知识点做一个笔记,让以后工作中忘记某个知识点能直接拿来用,在此进行一个总结. Parallel数据和任务并行 一.Parallel.For 1.用Parallel.For并行运行迭代 static void ParallelFor() { ParallelLoopResult result = Parallel.For(0, 10, item => { Console.WriteLine("{0},任务{1

C++primer拾遗(第一章:开始)

本系列将总结正在阅读的C++primer这本书中值得注意又容易忘记的知识点. 1. 当return语句包括一个值时,次返回值的类型必须与函数返回类型相同. 2. 操纵符 endl.写入该符号的效果是:1. 结束当前行(回车).2. 将与设备关联的缓冲区中的内容刷到设备中. 3. 注释界定符(/**/)不能嵌套. 4. istream对象遇到文件结束符时候状态变为无效(0,false).windows的文件结束符为Crtl +z:linux的为Crtl+D. 5. 包含对于不属于标准库的头文件,用

我的课程

c语言是每个大学生都必须学习的,对于学计算机的我更是不可避免.因此我会努力的学习下去. 一个学生对于课程的学习或多或少的有一种期望,而我的期望是学完c语言后能够看懂c语言程序,能够去了解这门语言,并获得能够自主学习每种计算机语言的能力.当然,路得慢慢走,我的学习底线是:不会挂科. 对于课堂,我并没有好的主意,但我希望老师能够在讲课的过程中提醒我们容易忘记的知识点,或者在课件中做特殊标记,这样我们可以做笔记,上了这么多节课,我还真不知道那处需要做笔记. 最后很高兴能与老师相识,祝老师身体健康.

《Python核心编程》第五章:数字

本章大纲 介绍Python支持的多种数字类型,包括:整型.长整型.布尔型.双精度浮点型.十进制浮点型和复数.介绍和数字相关的运算符和函数. 知识点 5.1 布尔型 从Python2.3开始支持bool,取值范围:True.False 5.2 标准整型 在32位机器上,标准整数类型的取值范围:-2的31次方 ~ 2的31次方-1 - Python标准整数类型等价于C语言的(有符号)长整型. - 八进制整数以数字 "0" 开头,十六进制整数以 "0x" 或 "