﻿# 發現 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\]
