switch (expression) {
case constant1: statements; break;
case constant2: case constant3: statements; break; // 群組 case
default: statements; break;
}
default 最多一個,位置任意char、string、enum、可為 null 版本C/C++ 經典 Bug:漏寫 break 導致非預期貫穿。C# 設計為預設安全,強制明確結束。若需貫穿,使用 goto case 使意圖顯性化。
int total = 365;
switch (month) {
case 1: total -= 31; goto case 2;
case 2: total -= 28; goto case 3;
case 3: total -= 31; goto case 4;
case 4: total -= 30; goto case 5;
case 5: total -= 31; goto case 6;
case 6: total -= 30; goto case 7;
case 7: total -= 31; goto case 8;
case 8: total -= 31; goto case 9;
case 9: total -= 30; goto case 10;
case 10: total -= 31; goto case 11;
case 11: total -= 30; goto case 12;
case 12: total -= 31; goto default;
default: total += day; break;
}
任何不導致貫穿的結構皆可:
switch (i) {
case 0: while (true) Foo(); // 無限迴圈不返回
case 1: throw new ArgumentException(); // 拋出例外
case 2: return; // 返回
case 3: break; // 標準
}
C# 支援 string 控制型別與 case "text" (C/C++ 僅限整數/字元)。
string tooltip = GetButtonTooltip();
switch (tooltip) {
case "OK": ShowMsg("Save and exit"); break;
case "Retry": ShowMsg("Return and retry"); break;
case "Abort": ShowMsg("Abort changes"); break;
case "Help": ShowMsg("Get help"); break;
default: ShowMsg("Unknown"); break;
}
case null: 合法,處理 null 參考
object obj = GetValue();
switch (obj) {
case int i: Console.WriteLine($"Integer: {i}"); break;
case string s: Console.WriteLine($"String: {s}"); break;
case null: Console.WriteLine("Null"); break;
default: Console.WriteLine("Other"); break;
}
switch (value) {
case int i when i > 0: Console.WriteLine("Positive"); break;
case int i when i < 0: Console.WriteLine("Negative"); break;
case int i: Console.WriteLine("Zero"); break;
}
// 運算式主體,自動返回值
var result = shape switch {
Rectangle r => r.Width * r.Height,
Circle c => Math.PI * c.Radius * c.Radius,
Triangle t => 0.5 * t.Base * t.Height,
_ => 0
};
// 屬性模式
var category = person switch {
{ Age: >= 65 } => "Senior",
{ Age: >= 18, IsEmployed: true } => "Working Adult",
{ Age: >= 18 } => "Adult",
_ => "Minor"
};
switch 可能編譯為 跳躍表 (Jump Table) O(1) 分派string switch 通常編譯為雜湊表或二元搜尋樹if-else 鏈C# switch 以「不可隱式貫穿」確保安全,支援 goto case 明確貫穿、string 標籤、型別/屬性/關係模式比對、Switch 運算式函數式風格。掌握模式比對語法,能將複雜條件邏輯轉化為清晰可維護的程式碼。