理解C#空值合併運算符
在C#中,空合併運算子 (??) 允許開發人員簡化空值檢查邏輯,減少程式碼冗長性並提高可讀性。 該運算子提供了一種簡潔方法來為遇到的空值賦予回退值,而不是寫冗長的if-else條件。 在本文中,我們將透過Gerald Versluis的影片《Understanding C# Null Coalescing Operator (??》來詳細探討空合併運算子。 and ??=)》](https://www.youtube.com/watch?v=aIp0jUr6A24&list=PLfbOp004UaYWWOZFZ585BCeRvTduLt9Fm&index=11)。我們將分解影片中的關鍵部分,分析Gerald如何展示這個實用的C#特性。
簡介
在影片的開頭,Gerald介紹了空合併運算子這一C#中的強大特性,它顯著減少了空值檢查所需的程式碼行數。 他強調,這一運算子簡化了條件檢查,使程式碼更具可讀性。 為了說明其優點,Gerald展示了一個範例應用程式,在那裏他實作並解釋了空合併運算子的各種使用案例。
範例應用程式大綱
Gerald從設置一個簡單的控制台應用程式開始。 他提到,在之前的影片中,他使用try.dot.net網站進行演示,但由於版本限制(僅支持C# 7),他轉而使用Visual Studio for Mac。 他保證這些範例在Visual Studio for Windows上也能正常運行。
為了準備演示,Gerald建立了一個基本的Name屬性:
public class Person
{
public string Name { get; set; }
}public class Person
{
public string Name { get; set; }
}然後,他初始化這個類的實例來展示空合併運算子在實際情況下的運作。
用空合併運算子 (??) 取代空檢查
Gerald現在演示了如何使用空合併運算子 (??) 簡化空值檢查邏輯。 他將Name屬性設為空,然後使用?? 提供回退值:
var name = person.Name ?? "Gerald";var name = person.Name ?? "Gerald";Gerald解釋說,在此運算子出現之前,開發人員會使用if語句:
string name;
if (person.Name == null)
{
name = "Gerald";
}
else
{
name = person.Name;
}string name;
if (person.Name == null)
{
name = "Gerald";
}
else
{
name = person.Name;
}通過使用??,這一邏輯減少為一行。當person.Name為空時,'Gerald'被賦予其值; 否則,person.Name則保留原值。 他運行程式並確認輸出正確。
空合併拋出異常
接下來,Gerald探討了另一個使用案例:使用空合併運算子拋出異常。 他演示了如何在遇到空值時拋出異常,而不是提供回退值:
var name = person.Name ?? throw new ArgumentNullException(nameof(person.Name), "Name cannot be null");var name = person.Name ?? throw new ArgumentNullException(nameof(person.Name), "Name cannot be null");Gerald指出,這在使用方法參數或屬性時特別有用,因為不應允許空值。 他解釋說,這一特性是在C# 7或8中引入的,具體取決於專案設置。 執行帶有ArgumentNullException,有效地防止了意外的空引用。
空合併複合賦值 (??=)
Gerald繼續討論空合併複合賦值 (??=) 運算子,這種方法提供了更簡化的方式來賦予預設值。 取而代之的是書寫:
if (person.Name == null)
{
person.Name = "Gerald";
}if (person.Name == null)
{
person.Name = "Gerald";
}他用以下方法簡化:
person.Name ??= "Gerald";person.Name ??= "Gerald";Gerald解釋說,??=僅在左操作數為空時賦予指定值。 如果person.Name已經有值,則不變。 這個運算子在初始化字段或確保變數不會為空時特別有用。
與空條件運算子的結合
在最後的部分,Gerald演示了如何將空合併運算子與空條件運算子 (?.) 結合使用。 空條件運算子允許安全存取屬性,而不會引起NullReferenceException。 他提供了一個範例:
var length = person?.Name?.Length ?? 0;var length = person?.Name?.Length ?? 0;Gerald解釋說,這確保了當Name為空時,結果預設為0,而不是拋出異常。 這組合在處理可空引用型別或複雜的物件層次結構時非常有用。
結論
整段影片中,Gerald Versluis有效地解釋了空合併運算子(??)和空合併複合賦值(??=)的威力。 他展示了這些運算子如何取代傳統的空檢查,使程式碼更簡潔且易讀。 通過利用這些特性,開發人員可以編寫出更乾淨且更高效的C#應用程式。
如果您有興趣看到這些概念的實際應用,請觀看Gerald Versluis的完整影片《Understanding C# Null Coalescing Operator (??》 and ??=)》。

