在讨论可空类型前,先回顾一下.NET 对于类型的定义:
".NET 中类型分为值类型和引用类型,值类型不能为空,引用类型可为空";
在这样的前提下,所有值类型都赋予了一个初始值例如:int i;(初始为0);
由于数据库中出现的对应的值类型可为空,这样就出现了两者不能对应的问题。
所有在C# 2.0中引入了可为空的值类型,强调一点可空类型对于是值类型而言。
实现方法如下:
int i = 3;//一个值类型
int? k = 3;//一个可为空的值类型(简称可空类型)
int m = null;//错误
int? j = null;//正确
从上面的例子我们可以看到在值类型后加上?可以定义一个可为空的值类型。
这里我们再深入考虑下面两个问题:
1,可空类型是否是一种新的.NET数据类型呢?
2,可空类型和一般值类型有哪些区别呢?
回答如下;
1,可空类型是否是一种新的.NET数据类型呢?
可空类型不是一种新的.NET数据类型。
实际上空类型是定义在.NET库中的一种范型类System.Nullable<T>,其中T就是可替换的值类型。
int? k = 3;同样可以写作System.Nullable<int> k = 3;
其中的操作是通过该类的运算符重载实现的。
2,可空类型和一般值类型有哪些区别呢?
主要区别是空类型并不是一种真正的类型,而是一个对象。
例如;
int? j = 3;
int k = 3;
在反编译器(ildasm.exe)下面的状态是
[mscorlib]System.Nullable`1<int32> i
[1] int32 k
并且同时对于执行了Nullable默认构造函数
instance void valuetype [mscorlib]System.Nullable`1<int32>::.ctor(!0)
.NET 2.0在设计上面十分精巧,兼顾了向下兼容性同时也很好的运用抽象的特点处理好了可为空的值类型的实现。