跳過到頁腳內容
Iron Academy Logo
學習 C#
學習 C#

其他分類

C# 切換表達式解釋:Tim Corey 的實用指南

Tim Corey
9m 16s

在C#開發的世界中,編寫乾淨且可維護的代碼是一個關鍵目標。一個能夠幫助實現這一目標的現代C#功能是switch表達式——一種傳統switch語句的緊湊且強大的替代方案。 雖然常被忽視,但switch表達式簡化了複雜的分支邏輯,特別是在處理關係模式、模式匹配和常量模式時。

為了更好地理解此功能的工作原理以及其與傳統方法的比較,我們將觀看一段由Tim Corey製作的有幫助的視頻。 在他的"Switch Expressions In C#"的視頻中,Tim分解了switch表達式在C#中的實際用法,演示如何用更少的代碼編寫更好的代碼。

讓我們深入了解Tim的實用解釋,這從一個評分示例開始,並逐步建立使用介面、類型模式和物件評估的更高級場景。

傳統的If-Else與Switch表達式

Tim從一個控制台應用程式開始,其中一個名為numberGrade的int變數保存了測試分數,如85。目標是將此數字輸入值轉換為相應的字母等級,例如'B'。 在大多數情況下,開發人員會使用一系列if-else語句或switch語句,類似於這樣:

if (numberGrade >= 90)
    letterGrade = "A";
else if (numberGrade >= 80)
    letterGrade = "B";
// ...and so on
if (numberGrade >= 90)
    letterGrade = "A";
else if (numberGrade >= 80)
    letterGrade = "B";
// ...and so on

雖然這樣可行,但其篇幅冗長。 反過來,C#的switch表達式提供更乾淨的語法。

編寫一個用於評分的Switch表達式

為了演示switch表達式,Tim使用以下代碼重新編寫了上述邏輯:

string letterGrade = numberGrade switch
{
    >= 90 => "A",
    >= 80 => "B",
    >= 70 => "C",
    >= 60 => "D",
    _ => "F"
};
string letterGrade = numberGrade switch
{
    >= 90 => "A",
    >= 80 => "B",
    >= 70 => "C",
    >= 60 => "D",
    _ => "F"
};

在這裡,switch關鍵字在一個新上下文中使用——作為一個表達式,而不是語句。 這意味著它直接評估為一個值並可以分配給變數(如letterGrade)。

此形式支持關係模式(例如,>= 90)並使用丟棄模式(_)來處理默認情況,這等同於最後的else。

Tim指出,編譯器在運行時確定匹配,從上到下檢查每個條件,選擇與輸入相符的第一個模式。

使用表達式簡化代碼

用Tim的話來說,這種新語法"替換了許多代碼"。不必在else if中重複條件,switch表達式通過清晰、簡潔的結構處理一切。 這簡化了控制流程,改善了可讀性,並減少了邏輯中的冗餘。

他強調,這種結構在將輸入值映射到特定輸出時特別有用——如評分、狀態訊息或數據轉換。

使用物件類型的模式匹配

為了探索類型模式和模式匹配,Tim介紹了一個涉及IAnimal介面的場景。 他定義了三個類別——Dog、Cat和Cow——每個都實現了介面。 這使他能夠創建一個包含不同屬性的動物列表。

interface IAnimal { }

record Dog(string Name) : IAnimal;
record Cat(string Title, string Name) : IAnimal;
record Cow(string Breed) : IAnimal;
interface IAnimal { }

record Dog(string Name) : IAnimal;
record Cat(string Title, string Name) : IAnimal;
record Cow(string Breed) : IAnimal;

他填充了一個包含各種動物實例的列表,並演示如何使用類型模式匹配來識別物件類型並提取數據。

與模式匹配結合的Switch表達式

Tim顯示了以下代碼使用if語句:

if (a is Dog d)
    message = $"Dog: {d.Name}";
else if (a is Cat c)
    message = $"Cat: {c.Title} {c.Name}";
else if (a is Cow co)
    message = $"Cow: {co.Breed}";
else
    message = "Unknown animal";
if (a is Dog d)
    message = $"Dog: {d.Name}";
else if (a is Cat c)
    message = $"Cat: {c.Title} {c.Name}";
else if (a is Cow co)
    message = $"Cow: {co.Breed}";
else
    message = "Unknown animal";

可以被一個更緊湊且可讀性更強的switch表達式替換:

string message = a switch
{
    Dog d => $"Dog: {d.Name}",
    Cat c => $"Cat: {c.Title} {c.Name}",
    Cow co => $"Cow: {co.Breed}",
    _ => "Unknown animal"
};
string message = a switch
{
    Dog d => $"Dog: {d.Name}",
    Cat c => $"Cat: {c.Title} {c.Name}",
    Cow co => $"Cow: {co.Breed}",
    _ => "Unknown animal"
};

此表達式檢查物件的類型並根據匹配的模式應用正確的輸出。 如果沒有找到匹配,它會用丟棄_回退到默認結果。

此功能提高了功能性而不犧牲清晰性。 運行時行為仍然可預測且可讀。

使用when關鍵字的可選護欄

雖然沒有在Tim的示例中演示,但需要注意的是switch表達式可以使用when關鍵字擴展,以應用可選的布林條件:

int score = 90;

string result = score switch
{
    int s when s >= 90 && s <= 100 => "Excellent",
    int s when s >= 75 => "Good",
    _ => "Needs Improvement"
};
int score = 90;

string result = score switch
{
    int s when s >= 90 && s <= 100 => "Excellent",
    int s when s >= 75 => "Good",
    _ => "Needs Improvement"
};

在這裡,when子句允許使用更複雜的布林表達式來自定義評估參數。

最佳實踐和最終思考

Tim強調了一個關鍵概念:雖然switch表達式使代碼更緊湊,但緊湊並不總是更好。 有時,尤其是當邏輯複雜或輸入不清晰時,傳統的switch語句或if塊可能更合適。

您不必在每種情況下都使用switch表達式——為任務選擇正確的工具。 這不是關於加入"switch教派",正如Tim開玩笑所說。 這是在您的系統中編寫可維護且易於理解的代碼。

摘要:將Switch表達式添加到您的開發工具箱中

C#的switch表達式提供了一種現代且乾淨的方法來根據輸入模式評估並返回值,使用常量、關係和類型模式的結合。 當您希望簡化邏輯、減少樣板代碼並改善可讀性時,它們很理想。

從評分整數到識別動物物件,Tim Corey的視頻中的以下示例突顯了它們的實際用途。 無論您是構建用於計算結果的功能、處理用戶輸入,還是處理空值和未定義的情況,switch表達式都可以幫助節省時間、減少錯誤,並使您的代碼庫更易於管理。

正如Tim所說,"它們是您工具箱中的一個非常有幫助的工具,可以使您的代碼更簡單、更乾淨——而且同樣可理解,甚至更加。"

如果您希望提高C#代碼質量並跟上.NET Core的創新,那麼請不要錯過switch表達式。 試用它們,在您的Visual Studio專案中進行實驗,看看您的邏輯可以變得多麼清晰。

Hero Worlddot related to C# 切換表達式解釋:Tim Corey 的實用指南
Hero Affiliate related to C# 切換表達式解釋:Tim Corey 的實用指南

通過分享您所愛的東西賺得更多

您是否在為使用.NET、C#、Java、Python或Node.js的開發者創建內容?將您的專業知識轉化為額外收入!

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我