討論
本質上,下面兩個聲明是等價的:
int? myDBInt = null;
Nullable<int> myDBInt = new Nullable<int>();
兩個聲明中,myDBInt都被認為是可空類型並初始化為null。一個可空類型實現了InullableValue接口,它只有兩個屬性成員:HasValue和Value。如果把可空類型設置為null,HasValue屬性將返回false,否則將返回true。如果HasValue返回true,就可以訪問Value屬性以獲得可空數據類型裡當前存放的值。如果引發了InvalidOperationException異常,這是因為此時Value屬性還未被定義。
另外,測試可空類型可以有兩種方法。第一,使用HasValue屬性如下:
if (myDBInt.HasValue)
Console.WriteLine("Has a value: " + myDBInt.Value);
else
Console.WriteLine("Does not have a value (NULL)");
第二種方法是跟null對比:
if (myDBInt != null)
Console.WriteLine("Has a value: " + myDBInt.Value);
else
Console.WriteLine("Does not have a value (NULL)");
兩種方法都可以讓人接受。
當需要把可空類型轉換為非可空類型時,轉換操作將正常進行,如果可空類型被設置為null就會引發一個InvalidOperationException異常。當把一個非可空類型轉換為可空類型時,轉換操作將正常運行,不會引發InvalidOperationException異常,非可空類型永遠不會為null。
需要提防的是可空類型在進行比較運算的時候。例如執行下列代碼時:
if (myTempDBInt < 100)
Console.WriteLine("myTempDBInt < 100");
else
Console.WriteLine("myTempDBInt >= 100");
“myTempDBInt < 100”這句代碼明顯有錯。為了修正它,您不得不檢查myTempDBInt是否為空。如果不是,才能執行if語句裡的代碼塊:
if (myTempDBInt != null)
{
if (myTempDBInt < 100)
Console.WriteLine("myTempDBInt < 100");
else
Console.WriteLine("myTempDBInt >= 100");
}
else
{
// 在這裡處理空值
}
另外一個有趣的事情是您可以象使用一般數字類型一樣使用可空類型,如:
int? DBInt = 10;
int Value = 2;
int? Result = DBInt + Value; // Result == 12
如果表達式中的可空類型是一個null值,則表達式的結果為null,但如果沒有可空類型的值為null,運算符會把它當成一般類型。如上例中的DBInt為null,則Result的結果也為null。