跟小静读CLR via C#(14)-可空值类型,关于?和??的故事
发布日期:2021-05-19 02:37:51 浏览次数:26 分类:原创文章

本文共 1753 字,大约阅读时间需要 5 分钟。

我们都知道,值类型是不能为Null的,但是在实际应用中有些情形却需要将值类型置为null。因此,CLR中引用了可空值类型的用法。今天的文章中见到最多的符号估计就是?了吧。


?——初识可空值类型

1.    我们首先看一下可空值类型的声明方法。普通的非空值类型为null时会发生如下的提示:

   

但是只要在类型后面缀上个“?”,一切都解决了。此时变量的取值范围在原来基础上添加了一个null。

2.    实际上int? 对应着Nullable<Int32>类型。我们可以查看一下它的IL代码

3.    T?可空值类型包含了两个成员:

  • HasValue:bool类型,如果变量包含非空值,则返回true。否则为false。
  • Value:返回T类型的值。如果该实例为空,则会发生异常。

 

4.  当定义包含可空值类型的参数时,效率会比非空值类型低一些,它会生成很多的IL代码。 

private double? Add(double? price,int? number)

{

return price * number;

}

可空非空,你来我往

我们可以对可空值类型实例进行转型操作。在转换过程中, 对可空值类型的转换实际上是对Nullable<T>类型变量的转换。我们可以将可空值类型和非空值类型进行相互转换,还可以将可空值类型转换成相应基元类型的可控制类型。

例如:

  • ① 将null隐式转换成 Nullable<T>类型;
  • ② 将int32类型实例隐式转换成Nullable<Int32>类型;
  • ④ 将可空值类型从Nullable<Int32>类型显示转换成Int32类型;
  • ⑤ ⑥将可空值类型转换成相应的基元类型的可控制类型。

当操作符邂逅非空

非空值类型的操作符运算我们都很熟悉,那么当可空值类型遇到操作符,接下来会发生什么事呢?我们主要看一下操作数中包含Null的情况。

1. 一元操作符(+,-,++等):这个很简单,null遇到任何一元操作结果都是null。

2. 相等性操作符(==,!=):

  • 两个值都为null:相等。
  • 其中一个值不为Null:不相等。

3. 关系操作符(>,<,>=,<=):两个操作数任何一个是null,结果就是false。

4. 二元操作符(+,-,*等):一般情况下,任何一个操作符是null,结果就是null。

       不一般的就是&和|: 两个操作数都为Null时,结果为Null,这个好理解;

       当其中一个操作数为null时,情况特殊:

Null&true=null;   null|true=true;   null&false=false;   null|false=null

例如:

??

??,叫做“空接合操作符”,以a??b为例, 如果a!=null,则a??b=a;  如果a=null,则a??b=b。

其实它用起来感觉很像三元操作符 ?: ,不过对于方法等支持的更好。当我们把可空赋给非空时,可以用该操作符为其设置默认值。

特色的装箱、拆箱、GetType

之前看值类型那块的时候学过装箱和拆箱过程。CLR支持对可空值类型的装箱拆箱操作,它的流程与非空值类型略有差别:

1. 装箱

我们知道装箱就是将值类型转换为引用类型,可空值类型装箱时首先进行非空检查,如果为null,则直接返回null类型,没有实质上的装箱过程;如果非空,则同对待普通值类型一样进行装箱过程。

int? member1=null;

int member2 = 100;

object o1 = member1;

object o2 = member2;

2. 拆箱

可空值类型的拆箱就是将已装箱的T类型拆为T类型或者Nullable<T>。如果已装箱值类型的引用是null,则拆箱成Nullable<T>的结果也是null,如果想拆成T就会报异常了。

3. GetType()

GetType()方法是返回实例的类型的,前面我们说过可空值类型实际对应的是Nullable<T>类型,那么当调用GetType()方法时,返回的是T还是Nullable<T>呢?

我们眼见为实:

结果为

这也就是说GetType()方法返回的是T,而不是Nullable<T>。

 

相关文章: 


 

你也许喜欢:

 

快放假了,祝大家节日快乐,出行平安。 

上一篇:几种常用排序算法温习
下一篇:添加alert提示框的几种方法

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月17日 17时38分09秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

cmd编译.java文件 : java:720: 错误: 编码GBK的不可映射字符 Why ? ? ? ? 2021-05-16
第01问:MySQL 一次 insert 刷几次盘? 2021-05-16
非迅捷|PDF、Word、PPT、Excel、图片等互相在线转换:免费、简单、快速、零错误、无套路 2021-05-18
laravel server error 服务器内部错误 2021-05-18
一道简单的访问越界、栈溢出pwn解题记录 2021-05-18
2025最新智能优化算法:改进型雪雁算法(Improved Snow Geese Algorithm, ISGA)求解23个经典函数测试集 2025-03-28
Docker部署postgresql-11以及主从配置 2025-03-28
EnvironmentNotWritableError: The current user does not have write permissions to the target environm 2025-03-28
#C8# UVM中的factory机制 #S8.2.3# 重载sequence哪些情形 2025-03-29
java教师管理系统(ssm) 2025-03-29
el-select下拉框修改背景色 2025-03-29
elasticsearch 7.7.0 单节点配置x-pack 2025-03-29
Elasticsearch 之(16)_filter执行原理深度剖析(bitset机制与caching机制) 2025-03-29
Elasticsearch入门教程(Elasticsearch7,linux) 2025-03-29
ElasticSearch设置字段的keyword属性 2025-03-29
elasticsearch配置文件里的一些坑 [Failed to load settings from [elasticsearch.yml]] 2025-03-29
Elasticsearch面试题 2025-03-29
15个Python数据处理技巧(非常详细)零基础入门到精通,收藏这一篇就够了 2025-03-29
2024年全国程序员平均薪资排名:同样是程序员,为什么差这么多?零基础到精通,收藏这篇就够了 2025-03-29
2024大模型行业应用十大典范案例集(非常详细)零基础入门到精通,收藏这一篇就够了 2025-03-29