System.Nullable可空值类型---《clr via c#》笔记
2012-02-02 17:08 海不是蓝 阅读(538) 评论(0) 编辑 收藏 举报System.Nullable |
Clr对可空值类型支持的类,System.Nullable
它的内部实现就不啰嗦了,自己去看。
它有重要的1个方法和2个属性
public T GetValueOrDefault();
获取该类型的默认值
public bool HasValue { get; }
返回一个布尔值,对象是否包含值
public T Value { get; }
得到对象的值,如果对象是NULL,就会抛出异常。
try
{
System.Nullable<Int32> i = 2;
Console.WriteLine(i.HasValue);
Console.WriteLine(i.Value);
i = null;
Console.WriteLine(i.GetValueOrDefault());
Console.WriteLine(i.HasValue);
Console.WriteLine(i.Value);
}
catch (InvalidOperationException ex)
{
Console.WriteLine(ex.Message);
}
在使用使用可空值类型的时候应该先判断是否存在值,而不能像上面那样直接去获取值。
C#对可空值类型的支持 |
简单的语法
System.Nullable<Int32> i = 2;
等同于
Int32? i = 2;
可空值类型的转换和转型
Int32? i = 2;
Int32 j = (Int32)i;
上面是从可空值类型显式转换为Int32
Int32? i = 2;
double? d = i;
上面是可空值类型的转型,从Int32?转到Double?
然后就是可空值类型的各种操作符,应该和普通类型的操作符使用差不多吧,只是clr是相应对于可空值类型生成很多Il相关的处理代码。
语法糖!空接合操作符?? |
??的作用:它要获取2个操作数,假如左边的操作数不为null,那么返回这个操作数的值,如果左边的操作数为null,那么就返回右边的。
??奇妙的地方在于它既可以用于引用类型,又可以用于可空值类型。
Int32? i = 2;
//Int32? j = i.HasValue ? i.Value : 123;
Int32 j = i ?? 123;
上面注释掉的代码和下面那一行的代码等效的。
再看看引用类型的??
string str = null;
string str1 = str ?? "abc";
??的优点
1.在拉姆达这些里面使用能让代码变得简介和容易理解。
2.?书上貌似没说什么了,88
CLR对可空值类型的特殊关照 |
可空值类型的装箱拆箱
由于这个null,让可空值类型的装箱拆箱变得不那么顺利,但是clr对她特殊关照了下。
//对Int32? I进行装箱,要么返回Null,要么返回已装箱的I
Int32? i = null;
object obj = i;
对于已经装箱的值类型引用是null,而且要把他拆分为Nullable<T>,那么clr会将Nullable<T>的值设为null。
object obj = null;
Int32? i = (Int32?)obj;
Console.WriteLine(i ?? 0);
最后输出0。
CLR撒谎了!
在一个Nullable<T>对象上调用GetType()时,CLR会撒谎说类型是T,而不是Nullable<T>。
Int32? i = 2;
Console.WriteLine(i.GetType());
输出的是System.Int32。