在C# 2.0出现之前,C#程序员最感头痛的一件事是不能对某种类型变量指定null值。例如:对于int类型,则不能对变量赋null值。对于DateTime对象也是一样。这一限制迫使程序开发员不得不提出自己的方案与在工作区设置一个非null变量到null。在C#2.0中,微软采用一种nullable类型弥补了这一缺陷。
Nullable类型允许分配一个null给“值类型”,但是这在以前是不允许的。以前有些类型的例子不允许指定null值,包括DateTime、int、float和 decimal。
使用 Nullable Types
如何使用nullable类型呢?C#2.0提供了一个新的“?”类型修饰成分(问号)用于指定需要例示的nullable类型。下面代码(Figure A)说明了如何使用几种普通的nullable类型:
|
Figure A
|
|

|
|
几种普通的nullable类型
|
定义nullable类型后,则可以将变量的值设置成null。以下代码(Figure B)演示如何赋值,以及如何测试null变量值。
|
Figure B
|
|

|
|
变量检测
|
请注意,以上显示的CheckNull函数参数列表,我们必须使用?修饰成分说明nullable类型,如果不使用这个符号,则参数不被认为是nullable类型。
Nullable类型拥有一个称为“HasValue”的属性,如果对象是一个值,则返回真值,如果对象是null,则返回false值。“HasValue”的使用实例请见于Figure C中。
|
Figure C
|
|

|
|
HasValue
|
除了“HasValue”,nullable类型还包含一个属性“Value”,它返回nullable对象的当前值。但是,当对象也被设置成null时,调用“value”属性则会跳出一个InvalidOperationException异常,并且给出信息:“Nullable 对象必须有值”。Figure D说明了使用“Value”属性的过程。
|
Figure D
|
|

|
|
Value property
|
“GetValueOrDefault”也是nullable类型的一个属性。这一属性返回对象的当前值;或者,如果对象为null,则返回类型的默认值。例如:对于“int?”对象,如果此对象没有值,则其默认值为0。请参考以下代码(Figure E)实例。
|
Figure E
|
|

|
|
GetValueOrDefault
|
|