代码改变世界

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。