C#分支表達式說明: 來自Tim Corey的實用指南
在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 onif (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專案中進行實驗,看看您的邏輯可以變得多麼乾淨。

