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]