當多個 if-else 針對同一運算式比較不同常數值時,switch 陳述式提供更清晰、效能更佳的替代方案。本文涵蓋語法、規則、貫穿限制、模式比對(C# 7+)等完整內容。
switch (controllingExpression)
{
case constantExpression1:
statements;
break;
case constantExpression2:
statements;
break;
...
default:
statements;
break;
}
bool、char、string、enum、整數型別(int、long 等)及可隱含轉換至上述型別的類型。case x > 0: ❌)。break、return、throw 或 goto case 結束,避免 C/C++ 常見的漏寫 break Bug。switch (value)
{
case 1:
case 2: // 允許:無語句直接堆疊標籤
DoSomething();
break;
case 3:
DoSomething();
goto case 4; // 明確跳轉
case 4:
DoOther();
break;
}
public string EscapeXml(string input)
{
var sb = new StringBuilder();
foreach (char c in input)
{
switch (c)
{
case '<': sb.Append("<"); break;
case '>': sb.Append(">"); break;
case '&': sb.Append("&"); break;
case '"': sb.Append("""); break;
case '\'': sb.Append("'"); break;
default: sb.Append(c); break;
}
}
return sb.ToString();
}
現代 C# 擴充 switch 支援型別模式、屬性模式、Tuple 模式等:
public string Describe(object obj) => obj switch
{
int i when i > 0 => $"Positive integer: {i}",
int i when i < 0 => $"Negative integer: {i}",
string s when s.Length > 10 => $"Long string: {s}",
string s => $"String: {s}",
Person p => $"Person: {p.Name}, Age: {p.Age}",
null => "Null",
_ => "Unknown"
};
更簡潔的運算式語法,直接回傳值:
public decimal CalculateDiscount(Customer c) => c switch
{
{ IsVip: true, Years: > 5 } => 0.25m,
{ IsVip: true } => 0.15m,
{ Years: > 10 } => 0.10m,
_ => 0m
};
switch 優化為跳躍表或二元搜尋,對大量 case 效能優於 if-else 鏈。switch 內部使用雜湊表查找,效能良好。switch 從傳統陳述式演進為強大的模式比對工具。掌握基本規則(常數 case、無隱式貫穿)並善用新語法(switch expression、property pattern),能寫出更易讀、可維護且高效的分支邏輯。