The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

發現 C# 中有一個特殊的運算子 "??"

C# 中的這個運算子 "??" 主要用途是用來檢查變數的值是不是為 null,以往我們常用的方法是:

[code:c#]
    if (str2 != null) { str1 = str2; } else { str1 = "N/A"; }
[/code]

或是

[code:c#]
    string str1 = (str2 != null) ? str2 : "N/A";
[/code]

現在我們多了一種選擇,就是使用 "??" 運算子,如下範例中,如果 str2 不是 null 就會傳回 str2(左運算元),否則傳回 "N/A"(右運算元):

[code:c#]
    string str1 = str2 ?? "N/A";
[/code]

是不是比較簡單呢? ^_^

舉個更明確的例子:

1. 因為在有些時候,嘗試將「可為 null 的型別」指派給「不可為 null 的型別」時,將會產生編譯時期錯誤。這時使用 ?? 運算子就非常方便,你可以用 ?? 指定變數為 null 時應該給被指定的變數什麼「預設值」!

2. 另外,我們常常在做「型別轉換」時,如果轉換的型別是可為 Null 的型別但目前為未定義,執行的時候則將會擲回 InvalidOperationException 例外狀況,使用 ?? 運算子可以很迅速的解決這問題。

以下是從 MSDN 擷取的範例,我用自己的話註解說明:

[code:c#]
using System;
class MainClass
{
    // 取回可為 null 的 int 型別的方法
    static int? GetNullableInt()
    {
        return null;
    }

    // 取回型別為 null 的方法
    static string GetStringValue()
    {
        return null;
    }

    static void Main()
    {
        // ?? 運算子範例
        int? x = null;

        // 若 x 為 null 就回傳 -1,否則就會傳 x
        int y = x ?? -1;

        // 這範例用來展示 Method 回傳的值可能是 null
        // 使用 ?? 運算子檢查若為 null 則使用 default(int) 代替
        int i = GetNullableInt() ?? default(int);

        string s = GetStringValue();
        // ?? 運算子也適用於「參考型別」
        // 如果 s 為 null 時顯示 "Unspecified".
        Console.WriteLine(s ?? "Unspecified");
    }
}
[/code]