CodeGym /課程 /C# SELF /經典 switch 運算子

經典 switch 運算子

C# SELF
等級 10 , 課堂 3
開放

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 內部怎麼跑?— 步驟說明

  1. 先計算 switch 括號裡的表達式(這裡是 choice 變數)。
  2. 程式會依序跟每個 case 的值比對。
  3. 如果有符合,就執行那個區塊的指令。遇到 break 就跳出 switch 區塊。
  4. 如果都沒符合,就執行 default 區塊(如果有的話)。

視覺流程圖

變數值 case 1 case 2 case 3 default
1 +
2 +
3 +
其他 +

「+」— 這個區塊會被執行

3. 經典 switch 支援哪些型別?

在經典語法(就是還沒用 "Pattern Matching" 跟新功能,這些之後會講!)switch 支援:

  • 簡單整數型別(intbytecharlongshortsbyteushortuintulong
  • 字串(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: 這樣不行!)。
  • doublefloat 或其他浮點數值——只能用整數、string、char、enum。
  • 在一個 case 裡寫多個值(case 1, 2: 不行,要寫多個 case 連在一起)。

7. 特點與常見錯誤

在實際專案裡,switch 常用來做選單、狀態處理、指令、錯誤碼還有一堆其他事。但就像所有工具一樣,有些細節要注意。

常見錯誤:

  • 漏掉 break(剛剛講過了)。
  • switch 表達式型別錯誤(例如想用 double)。
  • 字串大小寫不符(case "Start": 不會等於 "start")——字串是區分大小寫的!
  • 沒處理到某些值(忘了 default,使用者輸入奇怪的東西)。

巢狀 switch 的陷阱
雖然有時會看到這種寫法,但通常很難讀。如果你發現自己在 switch 裡又寫 switch,可能該把程式碼拆成獨立方法,甚至用 OOP/enum/陣列來重構了。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION