首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# ?? 空值合併運算子完全指南:簡化 Null 判斷與預設值賦予

     編輯:關於C語言

前言

C# 2.0 引入 ??(Null-coalescing Operator),提供「若左運算元為 null 則取右運算元,否則取左運算元」的簡潔語法。它是處理可空型別、參考型別預設值的利器,能大幅減少 if (x == null) x = default; 等樣板代碼。

基本語法與語意

result = leftExpr ?? rightExpr;
// 等價於
result = (leftExpr != null) ? leftExpr : rightExpr;
// 但 leftExpr 只評估一次

經典使用場景

1. 字串預設值

string message = null;
string result = message ?? "It's null"; // "It's null"

message = "Hello World";
result = message ?? "It's null"; // "Hello World"

2. 可空值型別轉非可空

int? nullable = null;
int value = nullable ?? -1; // -1

nullable = 42;
value = nullable ?? -1; // 42

3. 物件初始化鏈式預設

var config = userConfig ?? systemConfig ?? defaultConfig ?? new Config();

4. 搭配 ??= (C# 8.0) 僅在 null 時賦值

// 僅當 _cache 為 null 時建立新實例
_cache ??= new Dictionary<string, object>();

型別規則與限制

左運算元型別右運算元型別結果型別備註
T (不可為 null 實值型別)--編譯錯誤:左運算元必須可為 null
T? (可空值型別)TT自動解包
T? (可空值型別)T?T?保持可空
string / class同型別或衍生型別同型別參考型別標準規則
interface實作類別interface介面型別回傳

進階:結合 ?. (Null-conditional) 使用

// 安全存取屬性鏈,任一環為 null 則整體為 null,最後給預設值
var displayName = user?.Profile?.DisplayName ?? "Guest";

效能與最佳實踐

  • 零額外開銷:編譯器產出極簡 IL,等同三元運算子但左運算元單一評估
  • 可讀性優先:單行表達預設值邏輯,優於 if/else 區塊
  • 避免濫用:複雜邏輯仍建議用 if 明確表達意圖
  • ??= 取代舊模式:if (_obj == null) _obj = new Obj(); → _obj ??= new Obj();

總結

?? 是 C# 處理 null 的核心語法糖,配合 ?.、??= 形成完整的「null 安全」語法家族。掌握其型別規則與鏈式用法,能寫出更簡潔、更安全、更具表達力的代碼。所有現代 C# 專案都應作為標準慣用語廣泛使用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved