条件语句 if/else 与 switch
本教程共 100 篇 · 第 17 篇 · 更新于 2026-07-31 · 约 9 分钟阅读
17. 条件语句 if/else 与 switch
本节目标:用 if/else 做二选一与多分支判断,并用 switch 处理”等于某值就执行某段”的多路选择。
程序不能只会直线执行。得根据不同情况走不同路——这就是条件语句(conditional statement)。这章先把 if/else 和 switch 的基础打牢。
if / else:最基本的选择
if 后面跟一个 bool 条件,成立就执行大括号里的代码:
namespace CSharpDemo;
int score = 85;
if (score >= 60)
{
Console.WriteLine("及格");
}
score >= 60 为 True,所以打印”及格”。条件不成立时,整块被跳过。
else:否则怎么办
else 接在 if 后面,处理”条件不成立”的情况:
if (score >= 60)
{
Console.WriteLine("及格");
}
else
{
Console.WriteLine("不及格");
}
二选一:及格走第一段,否则走 else 段。两者必有且仅有一段执行。
else if:多分支
条件不止两种时,用 else if 串联:
if (score >= 90)
{
Console.WriteLine("优秀");
}
else if (score >= 75)
{
Console.WriteLine("良好");
}
else if (score >= 60)
{
Console.WriteLine("及格");
}
else
{
Console.WriteLine("不及格");
}
从上往下判断,谁先成立就执行谁,后面的不再看。所以顺序很重要——把范围小的放前面。若先把 >= 60 放最前,90 分也会被它截走,逻辑就错了。
Tip
else if链里,条件和顺序强相关。写多分支时,先在纸上排好”从最严到最宽”,能避开大部分判断错乱。
单语句可省大括号
当 if/else 里只有一行,可省略大括号(不推荐但合法):
if (score >= 60) Console.WriteLine("及格");
else Console.WriteLine("不及格");
省括号看似省事,极易在以后加第二行时出错。建议始终写大括号,这是更稳的习惯。
switch:多路等值匹配
当判断的是”某个变量等于谁”这种多分支,if/else if 会很啰嗦,switch 更清爽:
string day = "周一";
switch (day)
{
case "周六":
case "周日":
Console.WriteLine("休息日");
break;
case "周五":
Console.WriteLine("快周末了");
break;
default:
Console.WriteLine("工作日");
break;
}
switch 按 day 的值逐个比对 case。case "周六" 和 "周日" 共用一段逻辑,故意省略中间 break 让它”落空”到下一句(称为贯穿,谨慎用)。default 是”以上都不匹配”的兜底,相当于 else。
Note每个
case末尾的break表示”跳出 switch”。漏写break,C# 通常要求显式处理(要么break、要么return、要么goto),不会像某些语言那样”无意贯穿”。这反而帮你少出 bug。
switch 与 if 怎么选
| 场景 | 推荐 |
|---|---|
| 范围判断(大于/小于) | if / else if |
| 离散等值(等于 A/B/C) | switch |
| 条件复杂、混合多种 | if / else if |
简单说:比大小用 if,对”等于哪几个固定值”用 switch。
一个综合示例
namespace CSharpDemo;
Console.Write("输入成绩:");
int score = int.Parse(Console.ReadLine()!);
if (score < 0 || score > 100)
{
Console.WriteLine("成绩应在 0–100");
}
else
{
string level = score >= 60 ? "及格" : "不及格";
Console.WriteLine($"结果:{level}");
}
这里 || 表示”或”,? : 是三元运算符(条件?真值:假值)。成绩超范围给提示,否则判及格。把前面学的逻辑、赋值、条件全串起来了。
if 和 switch 能嵌套吗
能。你可以在 if 里再写 if,在 switch 的 case 里再套 switch。但嵌套超过两层,可读性就断崖式下跌。
if (loggedIn)
{
if (isAdmin)
{
Console.WriteLine("进入管理后台");
}
}
上面这种”层层 if”可以改写成”提前返回”或合并条件:
if (!loggedIn) return;
if (isAdmin) Console.WriteLine("进入管理后台");
提前判断”不满足就退出”,主逻辑反而更平。这种”卫语句”风格在方法里很常见。
Tip看到三层以上嵌套
if,停下来想想能不能用”提前返回”压平,或把分支抽成独立方法。扁平的代码比深嵌套好读也好改。
条件判断的常见坑
- 把
==写成=:if (x = 5)是赋值不是判断,C# 通常要求if里是bool,这种写法大多直接报错(比某些语言友好),但要警觉。 - 浮点直接比相等:
if (a == 0.1 + 0.2)可能 False,因浮点误差。金额请用decimal。 - 忘了
else覆盖:多分支时,想清楚”都不满足时该怎么办”,必要时加else兜底。
常见疑问解答
问:switch 漏写 default 会出错吗?
不会编译错,但强烈建议写上 default 兜底,处理”谁都不匹配”的情况。漏写时,若值不匹配任何 case,就什么都不做悄悄跳过,容易埋 bug。
问:if 和 switch 性能差别大吗? 几乎没有。编译器会优化成相似的底层判断。选哪个看可读性,别为了”快”牺牲清晰。分支极少用 if,多分支等值用 switch。
问:case 里忘记 break 会怎样?
C# 不允许”无意贯穿”:若一个 case 有语句却没 break/return/goto,编译器报错要求你显式处理。这比某些语言更防错,避免了”忘了 break 导致执行掉进下一个 case”的经典 bug。
要点速记
if/else if/else管范围与复合条件。- 多分支等值优先
switch,default兜底。 else if链顺序从最严到最宽。- 嵌套过深用”提前返回”压平。
动手练一练
- 写一个成绩分段:用
if/else if把 0–100 的分数映射到”不及格/及格/良好/优秀”。 - 用
switch把星期字符串(“周一”…”周日”)分类为”工作日”或”休息日”,并写default兜底。 - 故意在
if里把==写成=,观察编译器是否报错,理解 C# 对条件类型的检查。
卫语句详解
“卫语句”(guard clause)指把”不满足就提前返回”的检查写在方法前面,让主逻辑保持平整,避免深层嵌套:
void Process(string? input)
{
if (input == null) return; // 卫语句:非法输入直接退
if (input.Length == 0) return;
Console.WriteLine($"处理:{input}");
}
对比”先 if 包住全部逻辑”的写法,卫语句把异常分支挡在门外,正常流程一目了然。这是让方法变短变清晰的常用技巧。
多分支的组织技巧
当 if/else if 分支很多,记住三点让代码不乱:
- 顺序从最严到最宽:把范围最小的放最前,避免被宽条件截走。
- 条件提纯:复杂判断抽成返回
bool的方法,主分支只剩if (IsValid(x))。 - 能用 switch 就换:若是离散等值,switch 比长串
else if更可读。
Tip如果分支超过五六个,往往说明这段逻辑该抽成方法或查表。过长的一连串判断是代码” smell “的信号,早点重构。
默认分支 default 的学问
switch 里的 default 不是装饰,而是”所有 case 都没命中时的去处”。漏写它,不匹配的值就会悄悄被忽略,常常埋下隐蔽 bug。所以习惯上:每个 switch 都写 default,哪怕里面只是打印一句”未知值”或抛个异常。
在 switch 表达式里更严格:编译器强制你覆盖所有情况(用 _ 兜底),否则直接报错不肯编译。这种”编译期就逼你想全”的设计,比语句版 switch 更安全。
Tip写
if/else if时同理:结尾留一个else兜底,处理”以上都不满足”。把”兜底”当成默认动作,而不是可有可无的尾巴。
小结与下一步
if/else 管范围与复合条件,switch 管离散等值匹配,default 兜底。两者覆盖绝大多数”做选择”的需求。
下一章升级 switch:用模式匹配写出更短更聪明的分支,包括 when 守卫和各种模式。