C#中的可空值类型介绍
由于一个值类型变量永远不可能为null,而数据库中的一个列是允许值为空的,为了与数据库中的列相对应,CLR引入了可空值类型。
C#中是以问号表示法声明并初始化可空值类型的,如下代码所示:
#001 int? x=5; #002 int? y=null; |
C#允许对可空值类型进行数据转换和转型,示例代码如下:
#001 int? x=5; #002 int z =(int)x; |
可以对可空值类型进行装箱。其规则是:若可空值类型为null,CLR不进行装箱操作并返回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 #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; # #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 } |