1. 前言
想像你是超夯咖啡廳的 barista。有個客人來點五種最愛的飲料之一。你不會在那邊哲學思考,而是直接看菜單回應:「Cappuccino?當然沒問題!這是你的 cappuccino!」。如果你每個選項都用一個 if 來檢查,你的程式碼就會像午餐高峰後的杯子堆一樣雜亂又難用。
switch 運算子 讓你可以很優雅地檢查變數值,根據結果做不同的事。它只支援特定資料型別(等等會講),但在大多數選單、簡單指令或狀態判斷時,這根本是神器。
2. C# 經典 switch 語法
這是最基本的流程圖:
switch (表達式) {
case 值1:
// 動作
break;
case 值2:
// 動作
break;
...
default:
// 預設動作
break;
}
C# 經典
switch 語法
範例 1:經典選單
Console.WriteLine("請選擇飲料:1 - 咖啡, 2 - 茶, 3 - 可可");
string input = Console.ReadLine();
int choice = int.Parse(input);
switch (choice)
{
case 1:
Console.WriteLine("你選了咖啡。超棒的選擇!");
break;
case 2:
Console.WriteLine("茶也不錯喔。");
break;
case 3:
Console.WriteLine("可可是懂生活的人的選擇!");
break;
default:
Console.WriteLine("菜單裡沒有這個飲料。");
break;
}
- switch 區塊會檢查 choice 是否等於每個 case 後面的值。
- 每個 case 後面一定要寫 break;,不然會直接執行下一個 case(等等會講)。
- default 區塊就像 else;如果沒有任何 case 符合就會執行它。
switch 內部怎麼跑?— 步驟說明
- 先計算 switch 括號裡的表達式(這裡是 choice 變數)。
- 程式會依序跟每個 case 的值比對。
- 如果有符合,就執行那個區塊的指令。遇到 break 就跳出 switch 區塊。
- 如果都沒符合,就執行 default 區塊(如果有的話)。
視覺流程圖
| 變數值 | case 1 | case 2 | case 3 | default |
|---|---|---|---|---|
| 1 | + | |||
| 2 | + | |||
| 3 | + | |||
| 其他 | + |
「+」— 這個區塊會被執行
3. 經典 switch 支援哪些型別?
在經典語法(就是還沒用 "Pattern Matching" 跟新功能,這些之後會講!)switch 支援:
- 簡單整數型別(int、byte、char、long、short、sbyte、ushort、uint、ulong)
- 字串(string)
- 列舉(enum)
- 字元(char)
範例 2:用字串切換
Console.WriteLine("請選擇指令:start, stop, pause");
string command = Console.ReadLine();
switch (command)
{
case "start":
Console.WriteLine("程式已啟動!");
break;
case "stop":
Console.WriteLine("程式已停止。");
break;
case "pause":
Console.WriteLine("程式暫停中。");
break;
default:
Console.WriteLine("未知指令。");
break;
}
4. 為什麼要 break?忘了會怎樣?
新手最常見的 bug 就是忘記在 case 裡加 break;。來看看會發生什麼事。
範例 3:掉進下一個區塊(fall-through)
int day = 2;
switch (day)
{
case 1:
Console.WriteLine("星期一");
break;
case 2:
Console.WriteLine("星期二");
case 3:
Console.WriteLine("星期三");
break;
default:
Console.WriteLine("未知的星期");
break;
}
會發生什麼?
- 一開始 day = 2。
- 先執行:"星期二"
- 沒 break,直接跑進 case 3 執行:"星期三"
- 遇到 break; 就跳出。
畫面會看到:
星期二
星期三
這就是經典錯誤!
- 如果你只想做一件事,每個 case 都要加 break;。
- 如果(很少見)你想讓幾個 case 做同樣的事,可以「黏」在一起(下面有範例)。
5. case 值群組
有時候幾個值要做一樣的事,何必複製同樣的程式碼?
範例 4:多個 case 同樣反應
char grade = 'B';
switch (grade)
{
case 'A':
case 'B':
case 'C':
Console.WriteLine("及格!");
break;
case 'D':
case 'E':
Console.WriteLine("還有進步空間。");
break;
default:
Console.WriteLine("無效的成績。");
break;
}
發生什麼事?
- 如果 grade 是 'A'、'B' 或 'C',就會執行第一個區塊:"及格!"。
- 如果是 'D' 或 'E',就執行第二個區塊。
- 其他就 default。
6. 經典 switch 能做什麼、不能做什麼
可以:
- 在 case 裡用常數(literal),像是:case 1:、case 'A':、case "stop":。
- 比對 enum(列舉)。
- 可以不寫 default,但通常很有用。
不可以:
- 在 case 裡用變數(只能用常數)。
- 比對範圍(case >= 5:、case x > 10: 這樣不行!)。
- 用 double、float 或其他浮點數值——只能用整數、string、char、enum。
- 在一個 case 裡寫多個值(case 1, 2: 不行,要寫多個 case 連在一起)。
7. 特點與常見錯誤
在實際專案裡,switch 常用來做選單、狀態處理、指令、錯誤碼還有一堆其他事。但就像所有工具一樣,有些細節要注意。
常見錯誤:
- 漏掉 break(剛剛講過了)。
- switch 表達式型別錯誤(例如想用 double)。
- 字串大小寫不符(case "Start": 不會等於 "start")——字串是區分大小寫的!
- 沒處理到某些值(忘了 default,使用者輸入奇怪的東西)。
巢狀 switch 的陷阱
雖然有時會看到這種寫法,但通常很難讀。如果你發現自己在 switch 裡又寫 switch,可能該把程式碼拆成獨立方法,甚至用 OOP/enum/陣列來重構了。
GO TO FULL VERSION