写 C# 时,控制流语句决定了程序“何时判断、执行几次、什么时候停下”。很多初学者并不是记不住语法,而是不清楚不同语句分别适合处理什么问题。下面就按条件判断、循环执行和流程跳转三个部分拆开讲,用一组直观示例把常见控制流的使用边界理顺。
条件判断:先决定代码该走哪一支
条件语句的作用,是让程序根据某个表达式的真假来选择不同分支。它们最常用于权限判断、状态判断、分数评级、菜单分发这类“满足条件才执行”的场景。

if:只处理“条件成立”的情况
if 是最基础的条件判断语句。当条件为 true 时,代码块会执行;如果条件不成立,就直接跳过。
语法结构:
if (condition)
{
// 当 condition 为 true 时,执行这里的代码
}
它适合只关心“能不能做”这一件事的场景。比如游戏里购买道具,只要金币够,就完成购买并扣除金额。
int playerGold = 120;
int itemCost = 100;
if (playerGold >= itemCost)
{
Console.WriteLine("金币足够,购买成功!");
playerGold -= itemCost; // 扣除金币
Console.WriteLine("剩余金币: " + playerGold);
}
在这段代码里,playerGold >= itemCost 也就是 120 >= 100,结果为 true,因此花括号内的逻辑会被执行。
if-else:同时覆盖成立与不成立两种结果
如果你不只想处理“成功”的情况,也想把“失败”时的反馈写清楚,就需要 else。它和 if 配合后,可以把真假两种分支都明确表达出来。
语法结构:
if (condition)
{
// 当 condition 为 true 时执行
}
else
{
// 当 condition 为 false 时执行
}
示例:
int playerGold = 70;
int itemCost = 100;
if (playerGold >= itemCost)
{
Console.WriteLine("购买成功!");
}
else
{
Console.WriteLine("金币不足,无法购买!");
}
// 输出: 金币不足,无法购买!
这种写法的好处是,调用方无论遇到哪种结果,程序行为都更完整,也更容易维护。
if-else if-else:处理多个互斥条件
当分支不止两个,而是多种互斥结果时,可以继续往下写 else if,形成一条条件链。程序会从上到下依次检查,一旦某个条件成立,就执行对应代码块,并跳过后续分支。
例如按分数给出不同等级:
int score = 85;
if (score >= 90)
{
Console.WriteLine("等级:优秀");
}
else if (score >= 75)
{
Console.WriteLine("等级:良好");
}
else if (score >= 60)
{
Console.WriteLine("等级:及格");
}
else
{
Console.WriteLine("等级:不及格");
}
// 输出: 等级:良好
这里的关键点不是语法本身,而是条件顺序。判断是按书写顺序进行的,所以范围更高、更严格的条件要放在前面,否则后面的分支可能永远不会被命中。
switch:同一个变量对应多个固定值时更清晰
如果你的判断逻辑,是围绕同一个变量去匹配多个固定值,那么一长串 if-else if 往往会显得啰嗦。这个时候,switch 通常更适合。
语法结构:
switch (variable)
{
case value1:
// 当 variable 等于 value1 时执行
break; // break 关键字是必须的,它会跳出 switch 结构
case value2:
// 当 variable 等于 value2 时执行
break;
default:
// 如果以上 case 都不匹配,则执行这里的代码
break;
}
switch 的优势主要在可读性上:每个分支都是一个明确的取值场景,结构更整齐,也更便于后续补充新分支。
int dayOfWeek = 3;
string dayName;
switch (dayOfWeek)
{
case 1:
dayName = "星期一";
break;
case 2:
dayName = "星期二";
break;
case 3:
dayName = "星期三";
break;
// ... 其他 case
default:
dayName = "无效的日期";
break;
}
Console.WriteLine(dayName); // 输出: 星期三
需要注意的是,示例里每个 case 后都使用了 break,这样在命中当前分支后就会立即跳出 switch 结构,不会继续往后执行。
循环语句:让同一段逻辑重复执行
如果一段代码需要执行多次,直接复制粘贴并不是好办法。循环语句的价值,就是用一套规则反复执行同一个代码块,直到满足退出条件。

for:适合固定次数的重复任务
for 循环最适合“我知道要执行多少次”的场景,比如遍历一个固定区间、重复触发若干次动作、按序号处理一批数据等。它把初始化、条件判断和迭代更新集中在一行里,结构紧凑。
语法结构:
for (initializer; condition; iterator)
{
// 循环体内的代码
}
initializer:循环开始前执行一次,通常用于声明并初始化循环变量。condition:每轮开始前判断是否继续执行,结果为true才进入循环体。iterator:每轮结束后执行,通常用于递增或递减循环变量。
示例:
for (int i = 1; i <= 5; i++)
{
Console.WriteLine("发射第 " + i + " 发子弹!");
}
这段代码会从 i = 1 开始,直到 i <= 5 不再成立为止,因此总共执行 5 次。
while:只要条件成立就持续执行
和 for 不同,while 更适合“循环次数不固定,但退出条件明确”的情况。只要条件一直为 true,循环就会继续执行。
语法结构:
while (condition)
{
// 只要 condition 为 true,就一直执行
}
使用 while 时有一个非常关键的风险点:循环体里必须有能力让条件最终变成 false,否则就会形成无限循环。
示例:
假设玩家生命值为 70,每次恢复 5 点,直到达到 100 为止:
int playerHealth = 70;
int maxHealth = 100;
while (playerHealth < maxHealth)
{
playerHealth += 5;
if (playerHealth > maxHealth)
{
playerHealth = maxHealth; // 防止超出最大生命值
}
Console.WriteLine("生命值恢复中... 当前生命: " + playerHealth);
}
Console.WriteLine("生命值已完全恢复!");
这里的退出条件是 playerHealth < maxHealth。随着每轮循环给生命值加 5,条件终会失效,循环自然结束。
do-while:至少先执行一次,再判断是否继续
do-while 和 while 的区别只有一个,但这个区别很重要:它会先执行一次循环体,再检查条件。因此,哪怕条件一开始就不满足,循环体也至少会运行一次。
语法结构:
do
{
// 这里的代码至少会执行一次
} while (condition);
这种形式很适合菜单显示、用户输入校验、首次提示这类“先做一次,再看要不要继续”的逻辑。
示例:
无论用户输入什么,程序都至少要先显示一次菜单:
int choice;
do
{
Console.WriteLine("===== 游戏菜单 =====");
Console.WriteLine("1. 开始游戏");
Console.WriteLine("2. 退出");
Console.Write("请输入你的选择: ");
choice = Convert.ToInt32(Console.ReadLine());
} while (choice != 1 && choice != 2);
Console.WriteLine("你已做出选择!");
因为判断写在后面,所以菜单一定会先输出一次,之后才根据 choice != 1 && choice != 2 决定是否继续循环。
跳转语句:在循环和方法中精细控制流程
当你已经进入循环或分支后,有时还需要更细的流程控制。例如找到目标后立刻停止、遇到特定元素先跳过、或在方法内部直接返回结果。这时就会用到跳转语句。

break、continue 和 return 分别解决什么问题
break:立即终止并跳出整个循环,或者跳出switch语句。continue:跳过当前这一轮循环余下的代码,直接进入下一轮。return:直接退出当前所在的方法。
这三者看起来都像“提前结束”,但层级并不一样。continue 只影响当前轮次,break 影响整个循环,return 则结束整个方法执行。
示例:
string[] inventory = { "剑", "盾牌", "生命药水", "钥匙", "地图" };
for (int i = 0; i < inventory.Length; i++)
{
if (inventory[i] == "生命药水")
{
Console.WriteLine("这是恢复道具,跳过。");
continue; // 跳过本次循环,继续检查下一个物品
}
if (inventory[i] == "钥匙")
{
Console.WriteLine("找到钥匙了!停止搜索。");
break; // 找到目标,跳出整个 for 循环
}
Console.WriteLine("检查物品: " + inventory[i]);
}
在这个例子里,遇到“生命药水”时不会停止搜索,只是跳过本轮;而一旦找到“钥匙”,整个 for 循环就会结束。这样的写法很适合搜索、过滤和条件中断场景。
实际开发里怎么选:按问题类型匹配语句
把这些语句放回真实开发场景里看,选择标准其实并不复杂:
- 只在条件成立时执行代码,用
if。 - 要明确处理“成立”和“不成立”两种结果,用
if-else。 - 有多个互斥区间或条件链,用
if-else if-else。 - 围绕同一个变量匹配多个固定值时,用
switch更清楚。 - 已知重复次数时,优先选
for。 - 不知道具体次数,但知道退出条件时,用
while。 - 要求循环体至少执行一次时,用
do-while。 - 循环中想跳过某轮,用
continue;想提前结束整个循环,用break;想直接结束方法,用return。
如果你把“语句名称”换成“要解决的问题类型”来记忆,控制流会比单纯背语法更容易掌握。对 C# 初学者来说,先弄清每种语句的触发条件、执行顺序和退出方式,后面阅读复杂业务代码就会轻松很多。









