<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);