C#中的可空值类型介绍

 

由于一个值类型变量永远不可能为null,而数据库中的一个列是允许值为空的,为了与数据库中的列相对应,CLR引入了可空值类型。

C#中是以问号表示法声明并初始化可空值类型的,如下代码所示:

#001 int? x=5;

#002 int? y=null;

C#允许对可空值类型进行数据转换和转型,示例代码如下:

#001 int? x=5;

#002 int z =(int)x;

可以对可空值类型进行装箱。其规则是:若可空值类型为nullCLR不进行装箱操作并返回null值,若不为null,则进行装箱。示例代码如下:

#001 static void NullToObject()

#002 {

#003   int? b =null;

#004   Object o =b;

#005   Console.WriteLine("o is null={0}",o==null);//结果o is null=Ture

#006   b=5;

#007   o=b;

#008   Console.WriteLine("o’s type={0}",o.GetType());

#009   //结果o’s type=System.Int32

#010 }

这个示例的中如果第一个结果o is null=True,则马上调用o.GetType()的时候将报错。

可以对可空值类型进行拆箱。CLR允许将一个已装箱的值类型T拆箱为一个T或一个Nullable<T>,示例代码如下:

#001 static void ObjectToNull()

#002 {

#003   Object o =5;

#004   int? a=(int?)o;

#005   int b=(int)o;

#006   Console.WriteLine("a={0},b={1}",a,b);  //结果a=5,b=5

#007   o=null;

#008   a=(int?)o;

#009 }

如果在第八行下面添加b=(int)o;这样就会报空引用异常错误。

通过可空值类型来调用GetType()方法,会发现得到的结果是System.Int32类型,而不是Systems.Nullable<Int32>类型。

通过可空值类型调用接口方法时,Nullable没有像Int32一样实现IComparable接口,但CLR允许下面的代码通过编译。

#001 static void NullUseInterface()

#002 {

#003   int? a=5;

#004   int b=((IComparable)a).CompareTo(5); //能通过编译

#005   Console.WriteLine(b);//结果为0

#006 }

posted @ 2008-11-04 14:25  IT爱好者  阅读(4503)  评论(0编辑  收藏  举报