C# 2.0 引入 ??(Null-coalescing Operator),提供「若左運算元為 null 則取右運算元,否則取左運算元」的簡潔語法。它是處理可空型別、參考型別預設值的利器,能大幅減少 if (x == null) x = default; 等樣板代碼。
result = leftExpr ?? rightExpr;
// 等價於
result = (leftExpr != null) ? leftExpr : rightExpr;
// 但 leftExpr 只評估一次
string message = null;
string result = message ?? "It's null"; // "It's null"
message = "Hello World";
result = message ?? "It's null"; // "Hello World"
int? nullable = null;
int value = nullable ?? -1; // -1
nullable = 42;
value = nullable ?? -1; // 42
var config = userConfig ?? systemConfig ?? defaultConfig ?? new Config();
// 僅當 _cache 為 null 時建立新實例
_cache ??= new Dictionary<string, object>();
| 左運算元型別 | 右運算元型別 | 結果型別 | 備註 |
|---|---|---|---|
| T (不可為 null 實值型別) | - | - | 編譯錯誤:左運算元必須可為 null |
| T? (可空值型別) | T | T | 自動解包 |
| T? (可空值型別) | T? | T? | 保持可空 |
| string / class | 同型別或衍生型別 | 同型別 | 參考型別標準規則 |
| interface | 實作類別 | interface | 介面型別回傳 |
// 安全存取屬性鏈,任一環為 null 則整體為 null,最後給預設值
var displayName = user?.Profile?.DisplayName ?? "Guest";
if/else 區塊if 明確表達意圖if (_obj == null) _obj = new Obj(); → _obj ??= new Obj();?? 是 C# 處理 null 的核心語法糖,配合 ?.、??= 形成完整的「null 安全」語法家族。掌握其型別規則與鏈式用法,能寫出更簡潔、更安全、更具表達力的代碼。所有現代 C# 專案都應作為標準慣用語廣泛使用。