<NET CLR via c# 第4版>笔记 第19章 可空值类型
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章 可空值类型的更多相关文章
- <NET CLR via c# 第4版>笔记 第5章 基元类型、引用类型和值类型
		
5.1 编程语言的基元类型 c#不管在什么操作系统上运行,int始终映射到System.Int32; long始终映射到System.Int64 可以通过checked/unchecked操作符/语句 ...
 - <NET CLR via c# 第4版>笔记 第18章 定制特性
		
18.1 使用定制特性 FCL 中的几个常用定制特性. DllImport 特性应用于方法,告诉 CLR 该方法的实现位于指定 DLL 的非托管代码中. Serializable 特性应用于类型,告诉 ...
 - <NET CLR via c# 第4版>笔记 第17章 委托
		
17.1 初识委托 .net 通过委托来提供回调函数机制. 委托确保回调方法是类型安全的. 委托允许顺序调用多个方法. 17.2 用委托回调静态方法 将方法绑定到委托时,C# 和 CLR 都允许引用类 ...
 - <NET CLR via c# 第4版>笔记 第16章 数组
		
//创建一个一维数组 int[] myIntegers; //声明一个数组引用 myIntegers = new int[100]; //创建含有100个int的数组 //创建一个二维数组 doubl ...
 - <NET CLR via c# 第4版>笔记 第13章 接口
		
13.1 类和接口继承 13.2 定义接口 C#用 interface 关键字定义接口.接口中可定义方法,事件,无参属性和有参属性(C#的索引器),但不能定义任何构造器方法,也不能定义任何实例字段. ...
 - <NET CLR via c# 第4版>笔记 第12章 泛型
		
泛型优势: 源代码保护 使用泛型算法的开发人员不需要访问算法的源代码.(使用c++模板的泛型技术,算法的源代码必须提供给使用算法的用户) 类型安全 向List<DateTime>实例添加一 ...
 - <NET CLR via c# 第4版>笔记 第6章 类型和成员基础
		
6.1 类型的各种成员 6.2 类型的可见性 public 全部可见 internal 程序集内可见(如忽略,默认为internal) 可通过设定友元程序集,允许其它程序集访问该程序集中的所有inte ...
 - <NET CLR via c# 第4版>笔记 第7章 常量和字段
		
7.1 常量 常量 是值从不变化的符号.定义常量符号时,它的值必须能够在编译时确定. 只能定义编译器识别的基元类型的常量,如果是非基元类型,需把值设为null. 常量的值直接嵌入代码,所以不能获取常量 ...
 - <NET CLR via c# 第4版>笔记 第8章 方法
		
8.1 实例构造器和类(引用类型) 构造引用类型的对象时,在调用类型的实例构造器之前,为对象分配的内存总是先被归零 .没有被构造器显式重写的所有字段都保证获得 0 或 null 值. 构造器不能被继承 ...
 
随机推荐
- 【Tomcat部署】Linux环境部署war包到tomcat
			
以turbine为例. 一.部署 1.下载或者生成war包(从maven上下载war包,并改名字为turbine.war) 2.将turbine.war拷贝到$TOMCAT_HOME/webapps中 ...
 - MVC ---- 理解学习Func用法
			
//Func用法 public static class FuncDemo{ public static void TestFunc(){ //数据源 List<User> usList ...
 - 【NOI2013】树的计数
			
Description 我们知道一棵有根树可以进行深度优先遍历(DFS)以及广度优先遍历(BFS)来生成这棵树的DFS序以及BFS序.两棵不同的树的DFS序有可能相同,并且它们的BFS序也有可能相同, ...
 - SRM 596 DIV2
			
250pt: 直接枚举跳过的位置求和即可. int n,m; int ABS(int a) { ) return (-a); else return a; } class FoxAndSightsee ...
 - Hibernate与iBastis 比较(转载)
			
Hibernate VS iBATIS 简介 Hibernate 是当前最流行的O/R mapping框架,当前版本是3.05.它出身于sf.net,现在已经成为Jboss的一部分了 iBATIS ...
 - MongoDB(课时14 正则运算)
			
3.2.4.9 正则运算 如果想实现模糊查询,必须使用正则表达式,而且正则表达式使用的语言是Perl兼容的正则表达式的形式. 要实现正则使用,则按照如下的定义格式: 基础语法:{key : 正则标记} ...
 - [库][c++]tinyxml2使用小结
			
参考:http://blog.csdn.net/educast/article/details/12908455 1.配置TinyXML2 去这里把项目弄下来,然后解压,我们之需要里面的tinyxml ...
 - mysql 超大数据/表管理技巧
			
如果你对长篇大论没有兴趣,也可以直接看看结果,或许你对结果感兴趣.在实际应用中经过存储.优化可以做到在超过9千万数据中的查询响应速度控制在1到20毫秒.看上去是个不错的成绩,不过优化这条路没有终点,当 ...
 - Codeforces 38B - Chess
			
38B - Chess 思路:懂点象棋的规则就可以,看看哪些点可以放马. 代码: #include<bits/stdc++.h> using namespace std; #define ...
 - HDU 6090 Rikka with Graph
			
Rikka with Graph 思路: 官方题解: 代码: #include<bits/stdc++.h> using namespace std; #define ll long lo ...