首页 / C# 入门教程 / 条件语句 if/else 与 switch

C# 入门教程

条件语句 if/else 与 switch

本教程共 100 篇 · 第 17 篇 · 更新于 2026-07-31 · 约 9 分钟阅读

C#C# 入门教程ifelseswitch条件语句

17. 条件语句 if/else 与 switch

本节目标:用 if/else 做二选一与多分支判断,并用 switch 处理”等于某值就执行某段”的多路选择。

程序不能只会直线执行。得根据不同情况走不同路——这就是条件语句(conditional statement)。这章先把 if/elseswitch 的基础打牢。

if / else:最基本的选择

if 后面跟一个 bool 条件,成立就执行大括号里的代码:

namespace CSharpDemo;

int score = 85;
if (score >= 60)
{
    Console.WriteLine("及格");
}

score >= 60True,所以打印”及格”。条件不成立时,整块被跳过。

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;
}

switchday 的值逐个比对 casecase "周六""周日" 共用一段逻辑,故意省略中间 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,在 switchcase 里再套 switch。但嵌套超过两层,可读性就断崖式下跌。

if (loggedIn)
{
    if (isAdmin)
    {
        Console.WriteLine("进入管理后台");
    }
}

上面这种”层层 if”可以改写成”提前返回”或合并条件:

if (!loggedIn) return;
if (isAdmin) Console.WriteLine("进入管理后台");

提前判断”不满足就退出”,主逻辑反而更平。这种”卫语句”风格在方法里很常见。

Tip

看到三层以上嵌套 if,停下来想想能不能用”提前返回”压平,或把分支抽成独立方法。扁平的代码比深嵌套好读也好改。

条件判断的常见坑

  1. == 写成 =if (x = 5) 是赋值不是判断,C# 通常要求 if 里是 bool,这种写法大多直接报错(比某些语言友好),但要警觉。
  2. 浮点直接比相等if (a == 0.1 + 0.2) 可能 False,因浮点误差。金额请用 decimal
  3. 忘了 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 管范围与复合条件。
  • 多分支等值优先 switchdefault 兜底。
  • else if 链顺序从最严到最宽。
  • 嵌套过深用”提前返回”压平。

动手练一练

  1. 写一个成绩分段:用 if/else if 把 0–100 的分数映射到”不及格/及格/良好/优秀”。
  2. switch 把星期字符串(“周一”…”周日”)分类为”工作日”或”休息日”,并写 default 兜底。
  3. 故意在 if 里把 == 写成 =,观察编译器是否报错,理解 C# 对条件类型的检查。

卫语句详解

“卫语句”(guard clause)指把”不满足就提前返回”的检查写在方法前面,让主逻辑保持平整,避免深层嵌套:

void Process(string? input)
{
    if (input == null) return;        // 卫语句:非法输入直接退
    if (input.Length == 0) return;
    Console.WriteLine($"处理:{input}");
}

对比”先 if 包住全部逻辑”的写法,卫语句把异常分支挡在门外,正常流程一目了然。这是让方法变短变清晰的常用技巧。

多分支的组织技巧

if/else if 分支很多,记住三点让代码不乱:

  1. 顺序从最严到最宽:把范围最小的放最前,避免被宽条件截走。
  2. 条件提纯:复杂判断抽成返回 bool 的方法,主分支只剩 if (IsValid(x))
  3. 能用 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 守卫和各种模式。