今天才接触到 可空类型, 这个类型的值非常有用,可以表示其基础值类型正常范围内的值,再加上一个null值, 如以前数据库中某个字段是支持空类型的,但是DataSet不支持空.就必须得加个值来表示空,现在有了可空类型就不需要了,空就是空。
定义: 可空类型是 System.Nullable 结构的实例。可空类型可以表示其基础值类型正常范围内的值,再加上一个 null 值。例如,Nullable<Int32>,读作“可空的 Int 32” ,可以被赋值为 -2147483648 到 2147483647 之间的任意值,也可以被赋值为 null 值。Nullable<bool> 可以被赋值为 true 或 false,或 null。在处理数据库和其他包含可能未赋值的元素的数据类型时,将 null 赋值给数值类型或布尔型的功能特别有用。例如,数据库中的布尔型字段可以存储值 true 或 false,或者,该字段也可以未定义。
特性:
l 可空类型表示可被赋值为 null 值的值类型变量。无法创建基于引用类型的可空类型。(引用类型已支持 null 值。)。
l 为可空类型赋值与为一般值类型赋值的方法相同,如 int? x = 10; 或 double? d = 4.108;。
l 语法 T? 是 System.Nullable<T> 的简写,此处的 T 为值类型。这两种形式可以互换。
l 使用 HasValue 和 Value 只读属性测试是否为空和检索值,例如 if(x.HasValue) j = x.Value;
n 如果此变量包含值,则 HasValue 属性返回 True;或者,如果此变量的值为空,则返回 False。
n 如果已赋值,则 Value 属性返回该值,否则将引发 System.InvalidOperationException。
n 可空类型变量的默认值将 HasValue 设置为 false。未定义 Value。
l 使用 ?? 运算符分配默认值,当前值为空的可空类型被赋值给非空类型时将应用该默认值,如 int? x = null; int y = x ?? -1;。
l 不允许使用嵌套的可空类型。将不编译下面一行:Nullable<Nullable<int>> n;
使用:
比如 int? i1 = null;
int i2 = 2;
i1 = 1;
i1 = i2;
但不能 i2 = i1 - 1; 应该是使用 i2 = i1 ?? -1 ; 当i1为null时 i1被当成0 ,也就是说结果为-1
int? e = null;
int? f = null;
//e和f为null时,结果为-1, 当e为null 其余g= f,e不会null g=e;
int g = e ?? f ?? -1;
另外 Nullable<int> num = null 等于 int?num = null
任何值类型都可用作可空类型的基础
int? i = 10;
double? d1 = 3.14;
bool? flag = null;
char? letter = 'a';
int?[] arr = new int?[10];
可空类型可强制转换为常规类型
但直接i2 = i1;报错
i2 = (int)i1;和i2 = i1.Valuel 都可以,但要是null一样抛出异常
在做比较时,可空类型如果当前为空,那么除null以外的比较结果始终为false
bool? 可空类型可以包含三个不同的值:true、false 和 null。它们本身不能用于条件语句,如 if、for 或 while。
可空布尔值类似于 SQL 中使用的布尔变量类型。为了确保 & 和 | 运算符产生的结果与 SQL 的三值布尔类型一致,提供了以下预定义的运算符:
bool? operator &(bool? x, bool? y)
bool? operator |(bool? x, bool? y)
下表中列出了这些运算符的结果:
X | y | x&y | x|y |
True | True | True | True |
True | False | False | True |
True | Null | Null | True |
False | True | False | True |
False | False | False | False |
False | Null | False | Null |
Null | True | Null | True |
Null | False | False | Null |
Null | Null | Null | Null |