Microsoft在CLR中引入了可空值类型(nullable value type)的概念。

FCL中定义System.Nullable<T>类如下:

[Serializable,StructLayout(LayoutKind.Sequential)]

public struct Nullable<T> where T: struct {

private Boolean hasValue=false;

internal T value=default(T);

………………(略)

}

一、             C#对可空值类型的支持

  1. Nullable<T>是值类型,实例仍然是”轻量级”的。即仍然可以在栈上,实例的大小就是原始值类型+Boolean字段大小。
  2. Int32?等价于Nullable<Int32>。
  3. 一元操作符(++,+,-,--,!,~) 操作数是null,结果就是null。
  4. 二元操作符(+,-,*,/,%,&,|,^,<<,>>)两个操作数中任何一个是null,结果就是null。

Int32?   a=5;

Int32?   b=null;

//一元操作符

a++;//6;

b=-b; //null;

//二元操作符

a=a+3;//a=9;

b=b*3;//b=null;

  1. 相等性操作符(==,!=)两个操作数都是null,两者相等;一个操作数是null这两者不相等。两个操作数都不是null,就比较值来判断是否相等。
  2. 关系操作符(<,>,<=,>=)两个操作数任何一个是null,结果就是false。两个操作数都不是null,就比较值。

二、C#的空结合操作符

  1. 空结合操作符(null-coalescing operator),即??操作符。
  2. 它要获取两个操作数,加入左边的操作数不为null,就返回这个操作数的值。如果左边的操作数为null,就返回右边的操作数的值。
  3. 利用空结合操作符,可以方便地变量的默认值。它既能拥有引用类型,也能用于可空值类型。
  4. ??在复合情形中更好用,如:

String  s= DoThing1() ?? DoThing2() ?? ”NoThing!”;

三、可空值的装箱、拆箱与调用GetType

  1. 当CLR对一个Nullable<T>实例进行装箱时,会检查它是否为null。

a)         若是,CLR不实际装箱,并返回null值;

b)         若不为null,CLR从可空类型中取出值,并对其进行装箱。

  1. CLR允许将一个已装箱的值类型T拆箱为一个T或者一个Nullable<T>。

若已装箱的值类型的引用是null,且要拆箱为一个Nullable<T>,那么CLR会将Nullable<T>的值设为null。

  1. Int32?  x=5;

Console.WriteLine(x.GetType());//输出System.Int32,而非System.Nullable<Int32>。

.NET 可空值类型的更多相关文章

  1. 匹夫细说C#:可以为null的值类型,详解可空值类型

    首先祝大家中秋佳节快乐~ 0x00 前言 众所周知的一点是C#语言是一种强调类型的语言,而C#作为Unity3D中的游戏脚本主流语言,在我们的开发工作中能够驾驭好它的这个特点便十分重要.事实上,怎么强 ...

  2. Util应用程序框架公共操作类(十):可空值类型扩展

    当你使用可空的值类型时,你会发现取值很不方便,比如Guid? obj,你要从obj中获取值,可以使用Value属性obj. Value,但obj可能为null,这时候就会抛出一个异常. 可空值类型提供 ...

  3. C#中的可空值类型

    C# 不允许把 null 赋给一个值类型的数据.在 C# 中,以下语句是非法的: int a = null;    // 非法 但是,利用 C# 定义的一个修饰符,可将一个变量声明为一个可空(null ...

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

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

  5. CLR via C#(14)-可空值类型,关于?和??的故事

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

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

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

  7. 第十七章 委托 第十八章 Attribute 第十九章 可空值类型

    1.委托揭秘 定义一个委托,编译器会生成一个继承自System.MulticastDelegate的类,所有的委托都继承自该类. 由于委托是类,所以能定义类的地方,都能定义委托. 委托内部有一个tar ...

  8. C# 关于NULL 可空值类型 ? 和空接操作符??

    作者 陈嘉栋(慕容小匹夫) C#引入了可空值类型的概念.在介绍究竟应该如何使用可空值类型之前,让我们先来看看在基础类库中定义的结构--System.Nullable<T>.以下代码便是Sy ...

  9. CLR via C#可空值类型

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

随机推荐

  1. 2016.6.20 计算机网络复习要点第三章之CSMA/CD协议

    1.最早的以太网是将许多计算机都连接到一根总线上: (1)总线的特点是:当一台计算机发送数据时,总线上的所有计算机都检测到这个数据,这种就是广播通信方式: (2)为了实现在总线上的一对一通信,可以使每 ...

  2. JavaScript中两个感叹号(!!)的作用是什么?

    !!一般用来将后面的表达式强制转换为布尔类型的数据(boolean),也就是只能是true或者false. 看这么个例子: var a: var b=!!a; a默认是undefined.!a是tru ...

  3. 改变传统的开单模式------手持POS终端移动销售开单 移动进销存的利器

    手持POS终端高清彩屏,清晰.美观.大方,适用于仓库.超市.服装.食品.批发零售.手机电脑等企业管理.可与管理软件灵活对接.1:员工记不住价格,产品名称,只要有PDA扫描,价格,库存,直接开销售单,打 ...

  4. UIBarButtonItem不能获取frame

    在使用KxMenu这个厉害的控件做竖直列表的时候,发现UIBarButtonItem不能获取到frame,UIBarButtonItem是NSObject的子类,他不是一个uiresponed或者ui ...

  5. html5中manifest特性测试

    测试环境和工具   chromium  18.0.1025.151 (开发编译版 130497 Linux) Ubuntu 11.04 一.测试内容 1.A页面manifest缓存的js文件,B页面不 ...

  6. TYVJ P1002 谁拿了最多奖学金 Label:模拟 水

    背景 NOIP2005复赛提高组第一题 描述 某校的惯例是在每学期的期末考试之后发放奖学金.发放的奖学金共有五种,获取的条件各自不同:1)     院士奖学金,每人8000元,期末平均成绩高于80分( ...

  7. NOIP200406合并果子

    试题描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆.    每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之 ...

  8. Redis中7种集合类型应用场景

    StringsStrings 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字.使用Strings类型,你可以完全实现目前 Memcached 的功能,并且效率更 ...

  9. Java 利用Apache Commons Net 实现 FTP文件上传下载

    package woxingwosu; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ...

  10. uc_key getshell

    <?php $key = 'cebbvi5s15BSiMXteaP9TNCIz5K5jAVekw7tcV9TqmYCNT5VOJdu7toOxipTX';#uc_key 写在这里 $url = ...