1. 入门
想象一下,你是个超火咖啡店的咖啡师。来个顾客,点了五种最爱的饮品之一。你不会搞哲学分析,直接看菜单反应:“卡布奇诺?没问题!给你卡布奇诺!”如果你每个选项都用 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;如果都不匹配就走这里。
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:字符串 switch
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 里用字面量(常量),比如:case 1:、case 'A':、case "停止":。
- 比较 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