在 .Net 中, value type與 reference type 有一個很大的差別,就是 value type 並沒有所謂的 null 值,但 reference type 則有。但是在某些情況裡,會需要 value type 的變數也能指定 null 值。一個最經典的例子就是資料庫,資料庫的欄位是可以允許 null 的情況發生,例如電子商務網站的會員資料表裡,有一欄位是會員的年收入,這一欄假設允許會員不填寫,那會員不填寫時該存什麼?存零的話,那在做會員平均收入時就會有誤差,這個時候系統應該存入 null 值。但之後撈取資料時就會有一個問題,假設年收入的資料型態是 integer ,遇到 null 值時就沒辦法表示,如同前面所言,填零的話資料就會失真。
針對這樣的情況,在 C# 2.0 時就加入了 Nullable Types 。 C# 已經邁入 5.0 版,相信這個功能很多人都已經知道,但大部份的人或許不知道 Nullable Types 是如何被實作出來的。
下列的兩行程式碼,在對編譯器而言是一模一樣的。
int? int1 = 1; Nullable<int> int2 = 1;
也就是說, int? 等同於 Nullable<int> ,而 Nullable 其實是 Struct 而不是 Class 。而 Nullable Types 還有一些好用的功能,像是:
Nullable<int> int2 = null; Console.WriteLine(int2.GetValueOrDefault());
而執行的結果是零,這樣的好處在於不用再額外判斷該變數是否為 null 。
最後再介紹一個好用的運算子: ?? 。
int? int1 = 5; Nullable<int> int2 = null; Console.WriteLine(int1 ?? int2);
因為 int2 是 null ,所以執行結果為 5 。
另一個情況下,這個運算子也很好用。
string str1 = null; Console.WriteLine(str1 ?? "未設定");
在 str1 為 null 的情況下,執行結果就是”未設定”,這樣的寫法也可以讓程式碼較為簡潔。