C/C++ 允許 switch 中 case 標籤後省略 break,導致執行流程「貫穿」至下一個 case。這常因開發者疏忽漏寫 break 而產生難以偵錯的 Bug。C# 為此禁止隱性貫穿,編譯器強制要求每個 case 區塊以跳躍陳述式結束。
case 排列順序可任意調整,不改變程式行為。goto case label;(跳至指定 case)goto default;(跳至 default)goto 外,throw、return、break 皆可結束 case 區塊。C# 同 VB.NET 一樣支援字串常值作為 case 標籤,C/C++ 不支援。範例:
string cmd = Console.ReadLine();
switch (cmd) {
case "START": StartEngine(); break;
case "STOP": StopEngine(); break;
case "PAUSE": PauseEngine(); break;
default: Console.WriteLine("未知指令"); break;
}
這大幅簡化命令解析、狀態機等常見情境的程式碼。
switch (status) {
case Status.Critical:
LogCritical();
goto case Status.Warning; // 明確貫穿至 Warning
case Status.Warning:
LogWarning();
NotifyAdmin();
break; // 必須以 break/return/throw/goto 結束
case Status.Normal:
LogInfo();
break;
default:
throw new ArgumentException("無效狀態");
}
C# switch 透過禁止隱性貫穿消除一大類常見錯誤,並新增字串標籤支援,配合 goto case 提供受控的貫穿機制,使控制流程更清晰、安全且具表達力。