System.Nullable<T>结构.

19.1 C# 对可空值类型的支持

  • C# 允许用问号表示法来声明可空值类型,如:
    Int32? x = 5;
Int32? y = null;
  • System.Nullable<T>应用操作符解析规则:

    • 一元操作符(+, ++, -, --, !, ~) 操作数是 null ,结果就是 null.
    • 二元操作符(+, -, *, /, %, &, |, ^, <<, >>) 两个操作数任何一个是 null ,结果就是 null . 但有一个例外,它发生在将 &| 操作符应用于 Boolean? 操作数的时候.这种情况和 SQL 的三值逻辑一样.都不为 null ,正常计算;都为 null ,结果为 null ;其一为 null 时,见下面示例:

      null & true = null ; null | true = true ; null & false = false ; null | false = null ;
    • 相等操作符(==, !=) 两个操作数都是 null,两者相等; 一个操作数是 null, 两者不相等;两个操作数都不是 null,就比较值来判断是否相等.
    • 关系操作符(<, >, <=, >=) 两个操作数任何一个是 null,结果就是 false ,两个操作数都不是 null,就比较值.
  • 操作可空实例会生成大量代码,且速度慢于非可空类型.
  • 定义自己的值类型来重载操作符,编译器能正确识别它并调用你重载的操作符(方法).

19.2 C# 的空接合操作符

  • C# 提供了一个"空接合操作符",即 ?? 操作符,它要取两个操作数.假如左边的操作数不为 null,就返回这个操作数的值,否则,就返回右边的操作数的值.
  • 既可用于引用类型,也能用于可空值类型.
        int? b = null;

        //下面等价于:
// x =(b.HasValue) ? b.Value : 123
int x = b ?? 123;
Console.WriteLine(x); // "123" //下面这行等价于:
// string temp = GetFilename();
// filename = (temp != null) ? temp : "Untitled";
string filename = GetFilename() ?? "Untitled";

19.3 CLR 对可空值类型的特殊支持

  • 装箱: 当 CLR 对 Nullable<T> 实例进行装箱时,会检查它是否为 null .如果是,CLR 不装箱任何东西,直接返回 null . 如果不为 null , CLR 从可空实例中取出值并进行装箱.
  • 拆箱:
        //创建已装箱的 Int32
object o = 5; //把它拆箱为一个 Nullable<int>和一个int
int? a = (int?)o; // a = 5
int b = (int)o; // a = 5 //创建初始化为null的一个引用
o = null; a = (int?)o; // a = null
b = (int)o; // NullReferenceException
  • Nullable<T> 对象上调用 GetType,会返回 T 的类型
  • Nullable<Int32> 类型的变量 n 可以转型为接口类型 IComparable<Int32>
        int? n = 5;
int result = ((IComparable)n).CompareTo(5);
Console.WriteLine(result);

<NET CLR via c# 第4版>笔记 第19章 可空值类型的更多相关文章

  1. <NET CLR via c# 第4版>笔记 第5章 基元类型、引用类型和值类型

    5.1 编程语言的基元类型 c#不管在什么操作系统上运行,int始终映射到System.Int32; long始终映射到System.Int64 可以通过checked/unchecked操作符/语句 ...

  2. <NET CLR via c# 第4版>笔记 第18章 定制特性

    18.1 使用定制特性 FCL 中的几个常用定制特性. DllImport 特性应用于方法,告诉 CLR 该方法的实现位于指定 DLL 的非托管代码中. Serializable 特性应用于类型,告诉 ...

  3. <NET CLR via c# 第4版>笔记 第17章 委托

    17.1 初识委托 .net 通过委托来提供回调函数机制. 委托确保回调方法是类型安全的. 委托允许顺序调用多个方法. 17.2 用委托回调静态方法 将方法绑定到委托时,C# 和 CLR 都允许引用类 ...

  4. <NET CLR via c# 第4版>笔记 第16章 数组

    //创建一个一维数组 int[] myIntegers; //声明一个数组引用 myIntegers = new int[100]; //创建含有100个int的数组 //创建一个二维数组 doubl ...

  5. <NET CLR via c# 第4版>笔记 第13章 接口

    13.1 类和接口继承 13.2 定义接口 C#用 interface 关键字定义接口.接口中可定义方法,事件,无参属性和有参属性(C#的索引器),但不能定义任何构造器方法,也不能定义任何实例字段. ...

  6. <NET CLR via c# 第4版>笔记 第12章 泛型

    泛型优势: 源代码保护 使用泛型算法的开发人员不需要访问算法的源代码.(使用c++模板的泛型技术,算法的源代码必须提供给使用算法的用户) 类型安全 向List<DateTime>实例添加一 ...

  7. <NET CLR via c# 第4版>笔记 第6章 类型和成员基础

    6.1 类型的各种成员 6.2 类型的可见性 public 全部可见 internal 程序集内可见(如忽略,默认为internal) 可通过设定友元程序集,允许其它程序集访问该程序集中的所有inte ...

  8. <NET CLR via c# 第4版>笔记 第7章 常量和字段

    7.1 常量 常量 是值从不变化的符号.定义常量符号时,它的值必须能够在编译时确定. 只能定义编译器识别的基元类型的常量,如果是非基元类型,需把值设为null. 常量的值直接嵌入代码,所以不能获取常量 ...

  9. <NET CLR via c# 第4版>笔记 第8章 方法

    8.1 实例构造器和类(引用类型) 构造引用类型的对象时,在调用类型的实例构造器之前,为对象分配的内存总是先被归零 .没有被构造器显式重写的所有字段都保证获得 0 或 null 值. 构造器不能被继承 ...

随机推荐

  1. 【Tomcat部署】Linux环境部署war包到tomcat

    以turbine为例. 一.部署 1.下载或者生成war包(从maven上下载war包,并改名字为turbine.war) 2.将turbine.war拷贝到$TOMCAT_HOME/webapps中 ...

  2. MVC ---- 理解学习Func用法

    //Func用法 public static class FuncDemo{ public static void TestFunc(){ //数据源 List<User> usList ...

  3. 【NOI2013】树的计数

    Description 我们知道一棵有根树可以进行深度优先遍历(DFS)以及广度优先遍历(BFS)来生成这棵树的DFS序以及BFS序.两棵不同的树的DFS序有可能相同,并且它们的BFS序也有可能相同, ...

  4. SRM 596 DIV2

    250pt: 直接枚举跳过的位置求和即可. int n,m; int ABS(int a) { ) return (-a); else return a; } class FoxAndSightsee ...

  5. Hibernate与iBastis 比较(转载)

    Hibernate  VS  iBATIS 简介 Hibernate 是当前最流行的O/R mapping框架,当前版本是3.05.它出身于sf.net,现在已经成为Jboss的一部分了 iBATIS ...

  6. MongoDB(课时14 正则运算)

    3.2.4.9 正则运算 如果想实现模糊查询,必须使用正则表达式,而且正则表达式使用的语言是Perl兼容的正则表达式的形式. 要实现正则使用,则按照如下的定义格式: 基础语法:{key : 正则标记} ...

  7. [库][c++]tinyxml2使用小结

    参考:http://blog.csdn.net/educast/article/details/12908455 1.配置TinyXML2 去这里把项目弄下来,然后解压,我们之需要里面的tinyxml ...

  8. mysql 超大数据/表管理技巧

    如果你对长篇大论没有兴趣,也可以直接看看结果,或许你对结果感兴趣.在实际应用中经过存储.优化可以做到在超过9千万数据中的查询响应速度控制在1到20毫秒.看上去是个不错的成绩,不过优化这条路没有终点,当 ...

  9. Codeforces 38B - Chess

    38B - Chess 思路:懂点象棋的规则就可以,看看哪些点可以放马. 代码: #include<bits/stdc++.h> using namespace std; #define ...

  10. HDU 6090 Rikka with Graph

    Rikka with Graph 思路: 官方题解: 代码: #include<bits/stdc++.h> using namespace std; #define ll long lo ...