當多個 if-else 連續判斷同一運算式對不同常數值時,改用 switch 更清晰、效能更佳:
// 多層 if-else
if (day == 0) dayName = "Sunday";
else if (day == 1) dayName = "Monday";
else if (day == 2) dayName = "Tuesday";
// ...
// 改為 switch
switch (day)
{
case 0: dayName = "Sunday"; break;
case 1: dayName = "Monday"; break;
case 2: dayName = "Tuesday"; break;
// ...
default: dayName = "Unknown"; break;
}
switch (控制運算式)
{
case 常數運算式1:
敘述區塊1; break;
case 常數運算式2:
敘述區塊2; break;
// ...
default:
預設敘述區塊; break;
}
case 開始執行,直到遇到 break、return 或 throw。default 時執行 default;否則跳過整個 switch。| 規則 | 說明 |
|---|---|
| 型別限制 | 僅支援基本型別(int、string、enum 等),複雜型別請用 if |
| case 必為常數 | 不可為執行期才能決定的運算式 |
| case 值唯一 | 不允許重複常數值 |
| 禁止貫穿 | C# 強制每個 case 以 break/return/throw 結束,防止 C/C++ 常見的漏寫 break bug |
| 允許堆疊 case | 連續多個 case 無敘述可共用同一區塊 |
switch (suit)
{
case Suit.Hearts:
case Suit.Diamonds:
color = "Red"; break; // 兩種花色同邏輯
case Suit.Clubs:
case Suit.Spades:
color = "Black"; break;
}
case Suit.Clubs:
color = "Black"; // 有敘述
case Suit.Spades: // ❌ 編譯錯誤:貫穿前有程式碼卻無 break
color = "Black";
break;
建立 Windows Forms 專案,兩個 TextBox 以 Button 分隔,點擊複製時將上方文字中的 XML 特殊字元轉義:
private void copyOne(char c)
{
switch (c)
{
case '<': target.Text += "<"; break;
case '>': target.Text += ">"; break;
case '&': target.Text += "&"; break;
case '"': target.Text += """; break;
case '\'': target.Text += "'"; break;
default: target.Text += c; break;
}
}
測試輸入 inRange = (lo <= number) && (number <= hi);,複製後正確轉義為 inRange = (lo <= number) && (number <= hi);。
