使用時機

操作資料庫或是定義一資料結構時,使用到 C# 的 value type,例如:

class Test
{
    public int x;
    public int y;
}

若是從資料庫取不到資料,可能此變數 x 就不去 assign 值,但是在讀取的時候還是讀取的到

Test c = new Test();
Console.WriteLine(c.x.ToString());  // 0

明明是沒有 assign 值阿,並不是 int 的初始值 0 阿!! 啊!我把 x 初始化給一個 -9999 的值代表沒有被 assign(此寫法很常見) 但這方法很不好,很明顯你會在你後面程式加一段

if(c.x == -9999) // not assignment
{
    //...
}

若好死不剛好就剛好出現 -9999 那就又頭大了 這個時候就是 nullable type 該出場的時候了。


Nullable Type

有兩種宣告方式,宣告完後初始值皆為 null 第一種:

Nullable<int> x;

第二種:

int? x;

我個人傾向使用第二種方式,簡單明瞭。 後面判斷時可用”HasValue” property 得知是否有值

Test c = new Test();
if (c.x.HasValue)
{
    Console.WriteLine(c.x.ToString());
}
else
{
    Console.WriteLine("not assign");
}

Nullable type assign to non-nullable type

若現在要把 x 的值 assign 給 y,

y = x; // compiler error

因為 y 不是nullable type,所以在使用時須強制轉換

y = (int) x;

這邊需要注意的是,若 x 為 null 的話會產生 exception。