C# 切換表達式解釋:Tim Corey 的實用指南
在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專案中進行實驗,看看您的邏輯可以變得多麼清晰。
