我们都知道,值类型是不能为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>。

CLR via C#(14)-可空值类型,关于?和??的故事的更多相关文章

  1. [CLR via C#]19. 可空值类型

    我们知道,一个值类型的变量永远不可能为null.它总是包含值类型本身.遗憾的是,这在某些情况下会成为问题.例如,设计一个数据库时,可将一个列定义成为一个32位的整数,并映射到FCL的Int32数据类型 ...

  2. CLR via C#可空值类型

    我们知道,一个值类型的变量永远不可能为null.它总是包含值类型本身.遗憾的是,这在某些情况下会成为问题.例如,设计一个数据库时,可将一个列定义成为一个32位的整数,并映射到FCL的Int32数据类型 ...

  3. .NET 可空值类型

    Microsoft在CLR中引入了可空值类型(nullable value type)的概念. FCL中定义System.Nullable<T>类如下: [Serializable,Str ...

  4. <NET CLR via c# 第4版>笔记 第19章 可空值类型

    System.Nullable<T> 是结构. 19.1 C# 对可空值类型的支持 C# 允许用问号表示法来声明可空值类型,如: Int32? x = 5; Int32? y = null ...

  5. [Clr via C#读书笔记]Cp19可空值类型

    Cp19可空值类型 主要解决的是和数据库中null对应的问题: System.Nullable结构:值类型: int?语法: 可空实例能够使用操作符: C#空合并操作符??; 即可用于引用类型,也可以 ...

  6. C# 可空值类型

    一个值类型永远不可能为null,但是当数据库中的某列数据允许为空时,或者另一种语言中的数据类型(引用类型)对应C#的是值类型,当需要和另外的语言交互时,就有可能需要处理空值的问题. 所以,CLR中引用 ...

  7. 【C#进阶系列】19 可空值类型

    可空值类型,正如字面意义上的,是可以为NULL的值类型. 这个东西存在的意义可以解决比如数据库的的Int可以为NUll的情况,使得处理数据库数据更简单. 实际上可空值类型就是Nullable<T ...

  8. .NET中可空值类型实现原理

    为了让.Net中的值类型可以赋值为null,微软特地添加了Nullable<T>类型,也可简写为T?.但是Nullable<T>自身是结构体,也是值类型,那么它是如何实现将nu ...

  9. 重温CLR(四)基元类型、引用类型、值类型

    编程语言的基元类型 编译器直接支持的数据类型称为基元类型(primitive type).基元类型直接映射到framework类型(fcl)中存在的类型. 下表列出fcl类型 从另一个角度,可以认为C ...

随机推荐

  1. smem – Linux 内存监视软件

    导读 Linux 系统的内存管理工作中,内存使用情况的监控是十分重要的,在各种 Linux 发行版上你会找到许多这种工具.它们的工作方式多种多样,在这里,我们将会介绍如何安装和使用这样的一个名为 sm ...

  2. Vijos P1769 网络的关键边

    Description 一个连通的无向图,有些点有A属性,有些点有B属性,可以同时具有.删掉某条边后,如果使得连通块中一些点不具有A,B属性的点,求这些边. Sol Tarjan求割边. 首先这些边一 ...

  3. BZOJ 3270: 博物馆

    Sol 期望DP+高斯消元. 根据本题题意列出期望方程\[E(i,j)=(1-p_i)(1-p_j)E(u,v)+(1-p_i)p_jE(u,j)+p_i(1-p_j)E(i,v)+p_ip_jE(i ...

  4. Arlenmbx!!!!

    我无限制的以安逸为想法 其实生活的不安逸 我所做的事情和思路到底正不正确? 我失败了? 我做不到? 我尝试做到? 我可以做到! 我能做到 我做到了我已经做到了 难道想法和现实是有区别的吗 有理想只是空 ...

  5. Dom初

    DOM基础 •什么是DOM •浏览器支持情况 lDOM节点 •childNodes  nodeType –获取子节点 <!DOCTYPE html PUBLIC "-//W3C//DT ...

  6. 在sublime-text中设置浏览器预览

    配置在Chrome,Firefox中打开 安装 SideBarEnhancements 然后通过ctrl + k, ctrl + b打开侧边栏,在侧边栏的文件中右击,找到 open width -&g ...

  7. .net MVC借助Iframe实现无刷新上传文件

    html: <div id="uploadwindow" style="display: none;"> <form action=" ...

  8. eclipse添加字体

    1.打开window—>Preferences—>General—>Appeatance—>Colors and Fonts—>Text Font—>Edit 2. ...

  9. Debian Vi 简介

    1.Vi 简介    Vi 是 Unix 世界里极为普遍的全萤幕文书编辑器,几乎可以说任何一台  Unix 机器都会提供这套软体.Linux 当然也有,它的 vi 其实是 elvis (版权问题),不 ...

  10. nyoj202_红黑树_中序遍历

    红黑树 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 什么是红黑树呢?顾名思义,跟枣树类似,红黑树是一种叶子是黑色果子是红色的树... 当然,这个是我说的... & ...