switch语句
一、Switch语句是什么¶
switch语句是一种基于变量值匹配的多分支语句。
二、switch语句的语法结构¶
switch (变量)
{
case 常量1: // ← 这是"case标签"
// 如果变量等于值1,执行这里的代码
break; // 必须用break跳出switch
case 常量2:
// 如果变量等于值2,执行这里的代码
break;
// ... 可以有任意多个case ...
default:
// 如果变量不等于任何case的值,执行这里的代码(可选)
break;
}
switch (变量表达式)
{
case 常量表达式: // ← 这是"case标签",标识分支入口点,翻译为“分支“;
语句列表 // ← 这是语句块
break; // ← 这是"跳转语句",控制跳出switch
case 常量表达式 : // ← 这是"case标签",标识分支入口点
语句列表
break;
default: // ← 这是"default标签",默认分支的入口点
语句列表
break;
}
语法说明
- 变量表达式:
- case:
case后必须是常量,不能是变量或表达式。 - break:翻译为“终止";
- 每个case块必须以跳转语句结束,最常用的就是
break;。 default是可选的,用于处理“其他所有情况”。- 每个
case一般要有break,否则会穿透执行下一个 case(除非你想要 fall-through 行为)。 - C# 7.0+ 支持
switch的模式匹配(比如case int n when n > 0:)。
用法1:整数类型 case¶
// 示例:根据月份判断季节
int month = 3;
string season;
switch (month)
{
case 12:
case 1:
case 2:
season = "冬季";
break;
case 3:
case 4:
case 5:
season = "春季";
break;
case 6:
case 7:
case 8:
season = "夏季";
break;
case 9:
case 10:
case 11:
season = "秋季";
break;
default:
season = "无效月份";
break;
}
Console.WriteLine($"{month}月是{season}");
// 输出:3月是春季
用法2:字符类型 case¶
// 示例:根据等级计算折扣
char grade = 'B';
double discount = 0;
switch (grade)
{
case 'A':
discount = 0.2; // 8折
break;
case 'B':
discount = 0.1; // 9折
break;
case 'C':
discount = 0.05; // 95折
break;
case 'D':
discount = 0; // 无折扣
break;
default:
Console.WriteLine("无效等级");
return;
}
Console.WriteLine($"等级{grade}享受{discount*100}%折扣,实际支付比例:{1-discount}");
// 输出:等级B享受10%折扣,实际支付比例:0.9
用法3:字符串类型 case(C# 7.0+)¶
// 示例:根据命令执行操作
string command = "start";
string response;
switch (command.ToLower()) // 转换为小写统一处理
{
case "start":
response = "系统正在启动...";
break;
case "stop":
response = "系统正在关闭...";
break;
case "restart":
response = "系统正在重启...";
break;
case "help":
response = "可用命令:start, stop, restart, help";
break;
default:
response = $"未知命令:{command}";
break;
}
Console.WriteLine(response);
// 输出:系统正在启动...
用法4:枚举类型 case¶
// 定义枚举
enum DayOfWeek
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}
// 使用switch判断
DayOfWeek today = DayOfWeek.Wednesday;
string schedule;
switch (today)
{
case DayOfWeek.Monday:
schedule = "周一例会";
break;
case DayOfWeek.Tuesday:
case DayOfWeek.Thursday:
schedule = "项目开发";
break;
case DayOfWeek.Wednesday:
schedule = "技术分享会";
break;
case DayOfWeek.Friday:
schedule = "代码审查";
break;
case DayOfWeek.Saturday:
case DayOfWeek.Sunday:
schedule = "休息日";
break;
default:
schedule = "正常工作日";
break;
}
Console.WriteLine($"{today}的安排:{schedule}");
// 输出:Wednesday的安排:技术分享会
用法5:范围匹配(C# 7.0+)¶
// 示例:根据分数评级
int score = 85;
string grade;
switch (score)
{
case int n when (n >= 90 && n <= 100):
grade = "A";
break;
case int n when (n >= 80 && n < 90):
grade = "B";
break;
case int n when (n >= 70 && n < 80):
grade = "C";
break;
case int n when (n >= 60 && n < 70):
grade = "D";
break;
case int n when (n >= 0 && n < 60):
grade = "F";
break;
default:
grade = "无效分数";
break;
}
Console.WriteLine($"分数{score}的等级是:{grade}");
// 输出:分数85的等级是:B
用法6:类型模式匹配(C# 7.0+)¶
// 示例:处理不同类型的数据
object obj = 42;
string result;
switch (obj)
{
case int i when i > 0:
result = $"正整数:{i}";
break;
case int i when i < 0:
result = $"负整数:{i}";
break;
case string s when s.Length > 0:
result = $"字符串:{s},长度:{s.Length}";
break;
case double d:
result = $"双精度数:{d:F2}";
break;
case null:
result = "空值";
break;
default:
result = $"未知类型:{obj.GetType().Name}";
break;
}
Console.WriteLine(result);
// 输出:正整数:42
用法7:多个条件组合¶
// 示例:根据坐标判断象限
int x = 3, y = -2;
string quadrant;
switch ((x, y)) // 使用元组
{
case (0, 0):
quadrant = "原点";
break;
case (_, 0):
quadrant = "X轴上";
break;
case (0, _):
quadrant = "Y轴上";
break;
case ( > 0, > 0):
quadrant = "第一象限";
break;
case ( < 0, > 0):
quadrant = "第二象限";
break;
case ( < 0, < 0):
quadrant = "第三象限";
break;
case ( > 0, < 0):
quadrant = "第四象限";
break;
default:
quadrant = "未知位置";
break;
}
Console.WriteLine($"坐标({x},{y})在{quadrant}");
// 输出:坐标(3,-2)在第四象限
用法8:使用 when 子句的复杂条件¶
// 示例:用户权限验证
string userRole = "Editor";
int userLevel = 2;
bool hasSpecialAccess = true;
string accessLevel;
switch (userRole)
{
case "Admin":
accessLevel = "完全访问权限";
break;
case "Editor" when userLevel >= 3 && hasSpecialAccess:
accessLevel = "高级编辑权限(带特殊访问)";
break;
case "Editor" when userLevel >= 2:
accessLevel = "标准编辑权限";
break;
case "Editor":
accessLevel = "基础编辑权限";
break;
case "Viewer" when userLevel >= 1:
accessLevel = "只读权限";
break;
default:
accessLevel = "无权限";
break;
}
Console.WriteLine($"用户角色:{userRole},权限:{accessLevel}");
// 输出:用户角色:Editor,权限:标准编辑权限
三、特殊注意事项¶
1. case 穿透问题(C#不允许)¶
// C# 中不允许 case 穿透,必须使用 break 或 return
int number = 1;
// 错误写法(编译错误)
switch (number)
{
case 1:
Console.WriteLine("等于1");
// 错误:控制不能从一个 case 标签贯穿到另一个 case 标签
case 2:
Console.WriteLine("等于2");
break;
}
// 正确写法:多个 case 共享代码块
switch (number)
{
case 1:
case 2: // case 1 和 2 共享同一个代码块
Console.WriteLine("等于1或2");
break;
case 3:
Console.WriteLine("等于3");
break;
}
2. default 子句的位置¶
// default 可以放在任何位置,但通常放在最后
int value = 10;
switch (value)
{
default: // default 放在前面
Console.WriteLine("其他值");
break;
case 1:
Console.WriteLine("等于1");
break;
case 2:
Console.WriteLine("等于2");
break;
}
// 但更常见的做法是把 default 放在最后
switch (value)
{
case 1:
Console.WriteLine("等于1");
break;
case 2:
Console.WriteLine("等于2");
break;
default: // 推荐放在最后
Console.WriteLine("其他值");
break;
}
3. 必须要有 break 或 return¶
// 每个非空 case 块必须用 break、return、goto 或 throw 结束
int code = 200;
switch (code)
{
case 200:
Console.WriteLine("成功");
return; // 使用 return 结束
case 404:
Console.WriteLine("未找到");
break; // 使用 break 结束
case 500:
throw new Exception("服务器错误"); // 使用 throw 结束
case 301:
Console.WriteLine("重定向");
goto case 200; // 使用 goto 跳转到其他 case
case 0: // 空 case,可以没有 break
// 什么也不做
default:
Console.WriteLine("未知状态码");
break;
}
4. 使用 goto case¶
// 示例:状态机转换
int state = 1;
switch (state)
{
case 1:
Console.WriteLine("状态1:初始化");
if (DateTime.Now.Second % 2 == 0)
goto case 2; // 跳转到状态2
else
goto case 3; // 跳转到状态3
break; // 这里的 break 永远不会执行
case 2:
Console.WriteLine("状态2:处理中");
goto case 4; // 跳转到状态4
case 3:
Console.WriteLine("状态3:等待");
goto case 4;
case 4:
Console.WriteLine("状态4:完成");
break;
}
四、实际应用示例¶
示例1:计算器程序¶
Console.Write("请输入第一个数字:");
double num1 = Convert.ToDouble(Console.ReadLine());
Console.Write("请输入运算符 (+, -, *, /):");
char op = Convert.ToChar(Console.ReadLine());
Console.Write("请输入第二个数字:");
double num2 = Convert.ToDouble(Console.ReadLine());
double result = 0;
bool validOperation = true;
switch (op)
{
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
if (num2 != 0)
result = num1 / num2;
else
{
Console.WriteLine("错误:除数不能为0!");
validOperation = false;
}
break;
default:
Console.WriteLine($"错误:不支持的运算符 '{op}'");
validOperation = false;
break;
}
if (validOperation)
Console.WriteLine($"结果:{num1} {op} {num2} = {result}");
示例2:工作日提醒¶
DateTime today = DateTime.Today;
string reminder;
switch (today.DayOfWeek)
{
case DayOfWeek.Monday:
reminder = "周一:每周例会,记得准备报告";
break;
case DayOfWeek.Tuesday:
reminder = "周二:项目进度检查";
break;
case DayOfWeek.Wednesday:
reminder = "周三:技术分享会";
break;
case DayOfWeek.Thursday:
reminder = "周四:客户会议";
break;
case DayOfWeek.Friday:
reminder = "周五:代码审查,周末前完成提交";
break;
case DayOfWeek.Saturday:
case DayOfWeek.Sunday:
reminder = "周末:好好休息,享受生活";
break;
default:
reminder = "正常工作日";
break;
}
Console.WriteLine($"{today:yyyy-MM-dd} {today.DayOfWeek}");
Console.WriteLine($"提醒:{reminder}");
示例3:游戏角色动作¶
enum PlayerAction { Idle, Walk, Run, Jump, Attack, Defend, Die }
PlayerAction currentAction = PlayerAction.Run;
string animation;
switch (currentAction)
{
case PlayerAction.Idle:
animation = "播放待机动画";
break;
case PlayerAction.Walk:
animation = "播放行走动画,速度=2";
break;
case PlayerAction.Run:
animation = "播放奔跑动画,速度=5";
break;
case PlayerAction.Jump:
animation = "播放跳跃动画,重力生效";
break;
case PlayerAction.Attack:
animation = "播放攻击动画,检测碰撞";
break;
case PlayerAction.Defend:
animation = "播放防御动画,减少伤害";
break;
case PlayerAction.Die:
animation = "播放死亡动画,游戏结束";
break;
default:
animation = "未知动作";
break;
}
Console.WriteLine($"角色动作:{currentAction}");
Console.WriteLine($"执行:{animation}");
五、switch 表达式(C# 8.0+)¶
// 更简洁的 switch 表达式
int score = 85;
// 传统 switch 语句
string grade1;
switch (score)
{
case >= 90: grade1 = "A"; break;
case >= 80: grade1 = "B"; break;
case >= 70: grade1 = "C"; break;
case >= 60: grade1 = "D"; break;
default: grade1 = "F"; break;
}
// C# 8.0 switch 表达式(更简洁)
string grade2 = score switch
{
>= 90 => "A",
>= 80 => "B",
>= 70 => "C",
>= 60 => "D",
_ => "F" // _ 表示默认
};
Console.WriteLine($"分数 {score}:传统方式={grade1},表达式方式={grade2}");
// 元组模式匹配
string result = (score, DateTime.Now.DayOfWeek) switch
{
(>= 90, DayOfWeek.Friday) => "高分且是周五,可以庆祝!",
(>= 90, _) => "高分",
(_, DayOfWeek.Friday) => "周五但分数一般",
_ => "继续努力"
};
六、最佳实践建议¶
- 优先使用 switch 表达式(C# 8.0+)
- 保持 case 数量合理,过多时考虑使用策略模式
- 为所有可能的情况提供处理,包括 default
- 避免在 case 中写复杂逻辑,提取为方法
- 利用 when 子句处理复杂条件
- 考虑使用字典(Dictionary)替代复杂 switch
// 如果 case 太多,考虑使用字典
var operationMap = new Dictionary<string, Func<double, double, double>>
{
["+"] = (a, b) => a + b,
["-"] = (a, b) => a - b,
["*"] = (a, b) => a * b,
["/"] = (a, b) => a / b
};
if (operationMap.TryGetValue("+", out var operation))
{
double result = operation(5, 3); // 结果:8
}
通过以上示例,您可以全面掌握 C# 中 switch 语句 case 的各种用法和最佳实践。
用法1:基础用法 - 计算器¶
这是最经典的例子,完美展示了switch的用途。
Console.Write("请输入第一个数字: ");
double num1 = Convert.ToDouble(Console.ReadLine());
Console.Write("请选择运算符 (+, -, *, /): ");
string op = Console.ReadLine();
Console.Write("请输入第二个数字: ");
double num2 = Convert.ToDouble(Console.ReadLine());
double result = 0;
bool validOp = true;
switch (op) // 要判断的变量是 op
{
case "+": // 如果 op == "+"
result = num1 + num2;
break; // 必须 break!
case "-":
result = num1 - num2;
break;
case "*":
result = num1 * num2;
break;
case "/":
if (num2 != 0)
result = num1 / num2;
else
Console.WriteLine("错误:除数不能为零!");
break;
default: // 如果 op 不是 +, -, *, / 中的任何一个
Console.WriteLine("错误:无效的运算符!");
validOp = false;
break;
}
if (validOp)
Console.WriteLine($"结果: {result}");
用法2:Case合并 - 成绩等级评定¶
多个case可以共享同一段执行代码。
Console.Write("请输入成绩等级 (A, B, C, D, F): ");
char grade = Char.ToUpper(Console.ReadKey().KeyChar); // 转换为大写
Console.WriteLine(); // 换行
switch (grade)
{
case 'A':
Console.WriteLine("优秀!");
break;
case 'B': // 注意:这里没有break,也没有代码
case 'C': // case 'B' 和 case 'C' 都会执行下一个case的代码
Console.WriteLine("良好。");
break; // 在这里统一break
case 'D':
Console.WriteLine("及格,需要努力。");
break;
case 'F':
Console.WriteLine("不及格。");
break;
default:
Console.WriteLine("无效的等级!");
break;
}
输出:
输入 B 或 C,都会输出 "良好。"。
用法3:现代写法 - Switch表达式¶
注意:不在考纲范围内,C# 8.0+支持
对于非常简单的switch,可以用更简洁的switch表达式,它直接返回一个值。
// 传统的switch语句
string dayName;
switch (dayNumber)
{
case 1: dayName = "周一"; break;
case 2: dayName = "周二"; break;
// ... 其他
default: dayName = "无效"; break;
}
// 现代的switch表达式 (更简洁!)
string dayName = dayNumber switch
{
1 => "周一",
2 => "周二",
3 => "周三",
4 => "周四",
5 => "周五",
6 => "周六",
7 => "周日",
_ => "无效" // _ 代表 default
};
Console.WriteLine(dayName);
四、何时使用Switch vs If-Else?¶
这是一个重要的决策:
| 场景 | 使用 | 例子 |
|---|---|---|
| 基于一个变量的多个==确切值进行分支 | switch |
菜单选项、状态码、枚举值、字符、固定数字 |
| 基于关系判断进行分支 | if-else |
if (score > 90), if (age >= 18 && age < 65) |
| 基于逻辑关系进行判断 | if-else |
if (isLoggedIn && hasPermission) |
简单记:有明确的值,用switch;条件复杂多变,用if-else。
五、给初学者的练习建议¶
- 模仿:先把计算器的例子自己敲一遍,确保能运行。
- 修改:尝试为计算器增加一个新的运算符,比如
%(取余)或^(幂运算)。 - 创造:
- 写一个程序,根据输入的数字1-12,输出对应的月份英文单词。
- 写一个简单的命令行菜单(1.新建 2.打开 3.保存 4.退出),用switch来处理用户选择。
掌握了switch语句,你的代码在处理多分支选择时会变得非常清晰和专业!
SWITCH多值判断(10道)¶
以下是10道 中等难度 的 C# switch 条件判断练习题,题目涵盖了整数、字符串、枚举、嵌套判断、多个 case 合并等常见情境,适合巩固 switch 语句用法。
✅ 题目1:星期名称¶
题目: 用户输入一个数字(1 到 7),使用 switch 输出对应的星期几名称。
✅ 题目2:月份天数¶
题目: 输入月份(1~12),输出该月天数(不考虑闰年)。
✅ 题目3:成绩等级判断¶
题目: 输入一个成绩(0~100),使用 switch 判断属于哪个等级:
- 90-100:优秀
- 80-89:良好
- 70-79:中等
- 60-69:及格
- 0-59:不及格
提示:可以先把成绩除以 10 再 switch。
✅ 题目4:菜单选择¶
题目: 模拟一个菜单程序,用户输入数字选择功能:
- 1:新建文件
- 2:打开文件
- 3:保存文件
- 4:退出程序
使用
switch实现对应输出。
✅ 题目5:判断季节¶
题目: 输入月份(1~12),使用 switch 判断是哪个季节:
- 春季:3, 4, 5
- 夏季:6, 7, 8
- 秋季:9, 10, 11
- 冬季:12, 1, 2
✅ 题目6:字符操作符匹配¶
题目: 用户输入一个操作符(如:+, -, *, /),输入两个数字,使用 switch 执行对应运算。
✅ 题目7:考试结果反馈¶
题目: 用户输入一个等级("A"、"B"、"C"、"D"、"F"),用 switch 输出评语。
✅ 题目8:国家拨号区号匹配¶
题目: 用户输入国家区号(如:86,1,81),用 switch 输出国家名称:
- 86:中国
- 1:美国
- 81:日本
- 44:英国
- 49:德国
✅ 题目9:使用枚举控制交通灯¶
题目: 使用枚举定义交通灯颜色(Red, Yellow, Green),用 switch 输出提示信息(如:停、准备、通行)。
✅ 题目10:根据字母判断元音/辅音¶
题目: 用户输入一个字母,使用 switch 判断是否为元音字母(a、e、i、o、u),其余为辅音。
SWITCH多值判断(答案)¶
下面是这10道 C# switch 条件判断题的参考答案,代码简洁明了,适合中等难度练习和理解。
题目1:星期名称
int day = int.Parse(Console.ReadLine());
switch (day)
{
case 1: Console.WriteLine("星期一"); break;
case 2: Console.WriteLine("星期二"); break;
case 3: Console.WriteLine("星期三"); break;
case 4: Console.WriteLine("星期四"); break;
case 5: Console.WriteLine("星期五"); break;
case 6: Console.WriteLine("星期六"); break;
case 7: Console.WriteLine("星期日"); break;
default: Console.WriteLine("输入无效"); break;
}
题目2:月份天数
int month = int.Parse(Console.ReadLine());
switch (month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
Console.WriteLine("31天"); break;
case 4:
case 6:
case 9:
case 11:
Console.WriteLine("30天"); break;
case 2:
Console.WriteLine("28天"); break;
default:
Console.WriteLine("无效的月份"); break;
}
题目3:成绩等级判断
int score = int.Parse(Console.ReadLine());
switch (score / 10)
{
case 10:
case 9: Console.WriteLine("优秀"); break;
case 8: Console.WriteLine("良好"); break;
case 7: Console.WriteLine("中等"); break;
case 6: Console.WriteLine("及格"); break;
default: Console.WriteLine("不及格"); break;
}
题目4:菜单选择
int choice = int.Parse(Console.ReadLine());
switch (choice)
{
case 1: Console.WriteLine("新建文件"); break;
case 2: Console.WriteLine("打开文件"); break;
case 3: Console.WriteLine("保存文件"); break;
case 4: Console.WriteLine("退出程序"); break;
default: Console.WriteLine("无效选择"); break;
}
题目5:判断季节
int m = int.Parse(Console.ReadLine());
switch (m)
{
case 3:
case 4:
case 5:
Console.WriteLine("春季"); break;
case 6:
case 7:
case 8:
Console.WriteLine("夏季"); break;
case 9:
case 10:
case 11:
Console.WriteLine("秋季"); break;
case 12:
case 1:
case 2:
Console.WriteLine("冬季"); break;
default:
Console.WriteLine("无效月份"); break;
}
题目6:字符操作符匹配
char op = char.Parse(Console.ReadLine());
int a = int.Parse(Console.ReadLine());
int b = int.Parse(Console.ReadLine());
switch (op)
{
case '+': Console.WriteLine(a + b); break;
case '-': Console.WriteLine(a - b); break;
case '*': Console.WriteLine(a * b); break;
case '/':
if (b != 0)
Console.WriteLine(a / b);
else
Console.WriteLine("除数不能为0");
break;
default:
Console.WriteLine("无效操作符"); break;
}
题目7:考试等级评语
string grade = Console.ReadLine();
switch (grade.ToUpper())
{
case "A": Console.WriteLine("非常棒!"); break;
case "B": Console.WriteLine("不错,加油!"); break;
case "C": Console.WriteLine("还行,要努力!"); break;
case "D": Console.WriteLine("危险边缘!"); break;
case "F": Console.WriteLine("不及格,需努力!"); break;
default: Console.WriteLine("无效等级"); break;
}
题目8:国家拨号区号匹配
int code = int.Parse(Console.ReadLine());
switch (code)
{
case 86: Console.WriteLine("中国"); break;
case 1: Console.WriteLine("美国"); break;
case 81: Console.WriteLine("日本"); break;
case 44: Console.WriteLine("英国"); break;
case 49: Console.WriteLine("德国"); break;
default: Console.WriteLine("未知国家"); break;
}
题目9:交通灯枚举
enum TrafficLight { Red, Yellow, Green }
TrafficLight light = (TrafficLight)Enum.Parse(typeof(TrafficLight), Console.ReadLine(), true);
switch (light)
{
case TrafficLight.Red: Console.WriteLine("停止"); break;
case TrafficLight.Yellow: Console.WriteLine("准备"); break;
case TrafficLight.Green: Console.WriteLine("通行"); break;
default: Console.WriteLine("未知信号"); break;
}
题目10:元音/辅音判断