Earn More by Sharing What You Love
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!

Tim Corey
9m 16s
在C#開發的世界中,撰寫乾淨且易於維護的程式碼是一個重要目標。幫助實現這一目標的現代C#功能之一是switch expression——一個緊湊且強大的替代傳統switch語句的方法。 儘管經常被忽視,switch expression簡化了複雜的分支邏輯,特別是在處理關係模式、模式匹配和常量模式時。
為了更好地理解這一功能的工作原理以及與傳統方法的比較,我們將通過Tim Corey的教學影片來了解。 在他有關"Switch Expressions In C#"的影片中,Tim分解了switch expression在C#中的實際應用,展示如何用更少的程式碼撰寫更好的程式碼。
讓我們深入了解Tim的實用解釋,從一個分級範例開始,逐步構建到使用介面、型別模式和物件評估的更高級場景。
Tim從一個控制台應用程式開始,在這裡一個名為numberGrade的int變數持有一個測試成績,比如85。目標是將這個數字輸入值轉換成對應的字母成績,例如"B"。 在大多數情況下,開發者會使用一系列if-else語句或switch語句,如下所示:
if (numberGrade >= 90)
letterGrade = "A";
else if (numberGrade >= 80)
letterGrade = "B";
// ...and so onIf numberGrade >= 90 Then
letterGrade = "A"
ElseIf numberGrade >= 80 Then
letterGrade = "B"
' ...and so on
End If雖然這樣做是可行的,但它過於冗長。 另一方面,C# switch expression提供了一個更乾淨的語法。
為了展示switch expression,Tim使用以下程式碼重寫了上述邏輯:
string letterGrade = numberGrade switch
{
>= 90 => "A",
>= 80 => "B",
>= 70 => "C",
>= 60 => "D",
_ => "F"
};Dim letterGrade As String =
If(numberGrade >= 90, "A",
If(numberGrade >= 80, "B",
If(numberGrade >= 70, "C",
If(numberGrade >= 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
End Interface
Record Dog(Name As String)
Implements IAnimal
End Record
Record Cat(Title As String, Name As String)
Implements IAnimal
End Record
Record Cow(Breed As String)
Implements IAnimal
End Record他填充了一個包含各種動物實例的列表,並演示如何利用型別模式匹配識別物件型別並提取資料。
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 TypeOf a Is Dog Then
Dim d As Dog = DirectCast(a, Dog)
message = $"Dog: {d.Name}"
ElseIf TypeOf a Is Cat Then
Dim c As Cat = DirectCast(a, Cat)
message = $"Cat: {c.Title} {c.Name}"
ElseIf TypeOf a Is Cow Then
Dim co As Cow = DirectCast(a, Cow)
message = $"Cow: {co.Breed}"
Else
message = "Unknown animal"
End If可以用更緊湊且可讀性強的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"
};Dim message As String =
If(TypeOf a Is Dog, $"Dog: {DirectCast(a, Dog).Name}",
If(TypeOf a Is Cat, $"Cat: {DirectCast(a, Cat).Title} {DirectCast(a, Cat).Name}",
If(TypeOf a Is Cow, $"Cow: {DirectCast(a, Cow).Breed}",
"Unknown animal")))此表達式檢查物件的型別並根據匹配的模式應用正確的輸出。 如果沒有找到匹配,它會回退到預設結果,使用丟棄_。
此功能在不犧牲清晰度的情況下增強了功能性。 運行時行為仍然可預測且易於閱讀。
儘管在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"
};Dim score As Integer = 90
Dim result As String = score Select Case
Case s When s >= 90 AndAlso s <= 100
Return "Excellent"
Case s When s >= 75
Return "Good"
Case Else
Return "Needs Improvement"
End Select在這裡,when子句允許對參數進行自定義評估,使用更複雜的布林表達式。
Tim強調了一個關鍵概念:雖然switch expression讓您的程式碼更緊湊,但緊湊不一定意味著更好。 有時,尤其是面對複雜邏輯或不清晰的輸入時,傳統的switch語句或if塊可能更合適。
您不必在每種情況下都使用switch expression——使用正確的工具完成工作。 這不是在加入"switch信徒",正如Tim開玩笑地說。 這關乎於在系統中撰寫可維護和可理解的程式碼。
C# switch expression提供了一種現代、清晰的方式來根據輸入模式評估並返回值,結合了常量、關係和型別模式。 當您想簡化邏輯、減少樣板並提高可讀性時,它們是理想的選擇。
從處理整數分級到識別動物物件,在Tim Corey的影片中的以下範例突顯了它們的實際應用。 無論您是在建構計算結果的功能、處理使用者輸入,還是處理null和未定義的情況,switch expression都可幫助節省時間、減少錯誤並讓您的程式碼庫更易於管理。
正如Tim所說,"它們是讓您的程式碼更簡單和更乾淨的非常有用的工具——而且即便不更加可理解,也依然如此。"
如果您想提高您的C#程式碼質量並跟上.NET Core的創新,不要忽略switch expression。 試試看,在您的Visual Studio專案中進行實驗,看看您的邏輯可以變得多麼乾淨。
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!
Join our newsletter, you’ll get exclusive access on article updates. We value your privacy