Nullabe类型可以表示所有基础类型的值,并在其基础上增加了一个null值。Nullable类型可以有如下两种方式声明:
System.Nullable<T> variable

或者:
T? variable
T是Nullable的基础类型。T可以是包含struct在内的任何值类型;它不能是一个引用类型。
比如你可能用到一个Nullable类型,考虑常规的Boolean变量,它只能有两个值:true和false.并没有一个值标明是"undefined"类型,在许多应用程序开发中,尤其是数据库的操作,变量有可能存在一种未定义(undefined)状态。例如,在数据库中有一个字段的值是true或者false,但是可能出现的情况是它并没有包含任何值。类似的,引用类型可以设置为null来表示它并没有被初始化。
通常的方法是用一个附加变量来记录状态信息,但这无疑增加了程序的工作量。C#中Nullable类型可以用来指示一个未定义的值。
关于Nullable类型的几个例子
任何值类型可以用来作为Nullable类型的基础,例如:
int? i = 10;
double? d1 = 3.14;
bool? flag = null;
char? letter = 'a';
int?[] arr = new int?[10];
Nullabe类型的成员
每一个Nullable类型的实例包含两个公共(public)的只读(read-only)属性:
HasValue是bool类型,当变量包含一个非空(non-null)值的时候它返回true;
Value是一个同基础类型相同的类型。如果HasValue返回true,Value包含一个有意义的值。如果HasValue返回false,访问Value的操作将会引发一个InalidOperationException的异常。
在下面的例子中,the HasValue成员用来在显示之前测试这个变量是否包含值。
int? x = 10;
if (x.HasValue)
{
System.Console.WriteLine(x.Value);
}
else
{
System.Console.WriteLine("Undefined");
}
还有一种方法来测试值:
int? y = 10;
if (y != null)
{
System.Console.WriteLine(y.Value);
}
else
{
System.Console.WriteLine("Undefined");
}
从普通类型向Nullable类型的转化是隐式的:
int? n2;
n2 = 10; // Implicit conversion.
操作符
预定义的一元和二元操作符和任何用户自定义的任何对值类型的操作符都可用在Nullabe类型上。当有操作数为null时运算结果为null;否则运算符用已有的值去计算结果。例如:
int? a = 10;
int? b = null;

a++; // Increment by 1, now a is 11.
a = a * 10; // Multiply by 10, now a is 110.
a = a + b; // Add b, now a is null.
当对Nullable类型做比较时,任一个Nullable类型的值为null,比较结果为false.因此,非常重要的一点是,不能因为当前比较的结果是false,就认为它的反方面是true.例如:
int? num1 = 10;
int? num2 = null;
if (num1 >= num2)
{
System.Console.WriteLine("num1 is greater than or equal to num2");
}
else
{
// num1 is NOT less than num2
}
在上述else部分的结论是不正确的,因为num2的值是null,它不包含一个值
??操作符
??操作符定义了当一个Nullable类型赋值给一个non-nullable类型时的默认值。
int? c = null;
// d = c, unless c is null, in which case d = -1.
int d = c ?? -1;
这个操作也可用在多个Nullable类型上,例如:
int? e = null;
int? f = null;
// g = e or f, unless e and f are both null, in which case g = -1.
int g = e ?? f ?? -1;
bool?类型
bool?类型包含三个值:true,false和null.因此,它们不能被用在if,for和while语句中,否则将会产生编译错误CS0266
bool? b = null;
if (b) // Error CS0266.
{
}
不允许这个是因为null值在条件语句中是没有明确意义的。Nullable的布尔类型可以显示的转化为bool类型,以便用在条件语句中,但是如果它的值是null,则会引发InvalidOpertionException异常,因此在转化为bool类型之前一定要检查HasValue的值。
Nullable布尔类型有点类似于SQL中的Boolean类型。为了保证&和|操作符的运算结果同SQL的三值Boolean类型的一致,提供了如下预定义的操作符:
bool? operator &(bool? x, bool? y)
bool? operator |(bool? x, bool? y)
操作符的运算结果见下表:
x |
y
|
x&y
|
x|y
|
|
True
|
true
|
True
|
true
|
|
True
|
false
|
False
|
true
|
|
True
|
null
|
Null
|
true
|
|
False
|
true
|
False
|
true
|
|
False
|
false
|
False
|
false
|
|
False
|
null
|
False
|
null
|
|
Null
|
true
|
Null
|
true
|
|
Null
|
false
|
False
|
null
|
|
Null
|
null
|
Null
|
null
|
翻译自:
http://msdn2.microsoft.com/en-us/library/2cf62fcy.aspx#