CodeGym /课程 /C# SELF /经典 switch 语句

经典 switch 语句

C# SELF
第 10 级, 课程 3
可用

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 内部怎么跑的?——一步步来

  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 支持:

  • 简单整数类型(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/数组了。

2
任务
C# SELF, 第 10 级, 课程 3
已锁定
确定星期几
确定星期几
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION