理解 C# 中的空合併操作符
C#中的空合併運算子 (??) 允許開發者簡化空值檢查邏輯,減少程式碼冗長,提升可讀性。 此運算子提供一種簡潔的方法,在遇到空值時分配後備值,無需撰寫冗長的if-else條件。 在這篇文章中,我們將通過跟隨Gerald Versluis的影片《理解C#中的空合併運算子 (?? 和 ??=)](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。 他保證這些範例也適用於Windows上的Visual Studio。
為了準備演示,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的完整影片《理解C#中的空合併運算子 (?? 和 ??=)》。
