跳至頁尾內容
Iron Academy Logo
學習C#
學習C#

其他類別

C#分支表達式說明: 來自Tim Corey的實用指南

Tim Corey
9m 16s

在C#開發的世界中,撰寫乾淨且易於維護的程式碼是一個重要目標。幫助實現這一目標的現代C#功能之一是switch expression——一個緊湊且強大的替代傳統switch語句的方法。 儘管經常被忽視,switch expression簡化了複雜的分支邏輯,特別是在處理關係模式、模式匹配和常量模式時。

為了更好地理解這一功能的工作原理以及與傳統方法的比較,我們將通過Tim Corey的教學影片來了解。 在他有關"Switch Expressions In C#"的影片中,Tim分解了switch expression在C#中的實際應用,展示如何用更少的程式碼撰寫更好的程式碼。

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

傳統If-Else與Switch Expression

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 expression提供了一個更乾淨的語法。

為分級撰寫Switch Expression

為了展示switch expression,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 expression在清晰、簡潔的結構中處理一切。 這簡化了控制流,提高了可讀性,並減少了冗餘的邏輯。

他強調這種結構在映射輸入值到特定輸出時特別有用——如分級、狀態消息或資料轉換。

使用型別模式的模式匹配

為了探索型別模式和模式匹配,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 Expression

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 expression替代:

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的範例中未演示,但值得注意的是,可以使用when關鍵字擴展switch expression,以應用可選的布林條件:

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 expression讓您的程式碼更緊湊,但緊湊不一定意味著更好。 有時,尤其是面對複雜邏輯或不清晰的輸入時,傳統的switch語句或if塊可能更合適。

您不必在每種情況下都使用switch expression——使用正確的工具完成工作。 這不是在加入"switch信徒",正如Tim開玩笑地說。 這關乎於在系統中撰寫可維護和可理解的程式碼。

摘要:將Switch Expression新增到您的開發者工具箱

C# switch expression提供了一種現代、清晰的方式來根據輸入模式評估並返回值,結合了常量、關係和型別模式。 當您想簡化邏輯、減少樣板並提高可讀性時,它們是理想的選擇。

從處理整數分級到識別動物物件,在Tim Corey的影片中的以下範例突顯了它們的實際應用。 無論您是在建構計算結果的功能、處理使用者輸入,還是處理null和未定義的情況,switch expression都可幫助節省時間、減少錯誤並讓您的程式碼庫更易於管理。

正如Tim所說,"它們是讓您的程式碼更簡單和更乾淨的非常有用的工具——而且即便不更加可理解,也依然如此。"

如果您想提高您的C#程式碼質量並跟上.NET Core的創新,不要忽略switch expression。 試試看,在您的Visual Studio專案中進行實驗,看看您的邏輯可以變得多麼乾淨。

Hero Worlddot related to C#分支表達式說明: 來自Tim Corey的實用指南
Hero Affiliate related to C#分支表達式說明: 來自Tim Corey的實用指南

分享您所愛以賺取更多報酬

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

Iron 支援團隊

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