Skip to content

C# - 循环

在编程中,我们经常需要多次重复执行某个操作。为了避免一遍又一遍地编写相同的代码,我们使用循环(loops)。循环是一种控制结构,它允许你只要满足特定条件就重复执行一段代码。

循环的基本思想可以可视化为一个周期:

+-------------------------+
| 条件为真吗? |
+-----------+-------------+
| 是
+---------v---------+
| 执行循环体 |
+---------+---------+
|
+---------v---------+
| 更新状态 | (例如,递增计数器)
+---------+---------+
|
+-----------+ (返回并再次检查条件)
+-----------+-------------+
| 否 |
+-----------v-------------+
| 退出循环 |
+-------------------------+

C# 提供了几种类型的循环,每种都适用于不同的场景。

循环类型最佳应用场景
for 循环当你明确知道迭代次数时(例如,重复 10 次)。
foreach 循环遍历集合(如列表或数组)中的所有元素时。
while 循环当你希望在条件为真时持续循环,并且事先不知道迭代次数时。
do-while 循环类似于 while 循环,但保证循环体至少执行一次。

for 循环非常适合当你需要执行一段代码特定次数时使用。它由三个部分组成:初始化器、条件和迭代器。

using System;
// 打印 1 到 5 的数字
for (int i = 1; i <= 5; i++)
{
// i = 1: 初始化器(在开始时运行一次)
// i <= 5: 条件(在每次迭代前检查)
// i++: 迭代器(在每次迭代后运行)
Console.WriteLine($"Current number: {i}");
}

输出:

Current number: 1
Current number: 2
Current number: 3
Current number: 4
Current number: 5

foreach 循环提供了一种简单、清晰的方式来遍历集合中的元素,例如数组、列表或字典。对于此任务,它通常是最具可读性的选择。

using System;
using System.Collections.Generic;
var fruits = new List<string> { "Apple", "Banana", "Cherry" };
// 遍历 'fruits' 列表中的每个元素
foreach (var fruit in fruits)
{
Console.WriteLine($"I like {fruit}s!");
}

输出:

I like Apples!
I like Bananas!
I like Cherrys!

只要给定条件为 true,while 循环就会重复执行一段代码。条件在每次迭代之前检查。

using System;
int countdown = 3;
while (countdown > 0)
{
Console.WriteLine($"{countdown}...");
countdown--; // 改变变量以避免无限循环至关重要
}
Console.WriteLine("Lift off!");

输出:

3...
2...
1...
Lift off!

do-while 循环类似于 while 循环,但条件在循环体执行之后检查。这保证了循环至少执行一次。

using System;
string? input;
do
{
Console.WriteLine("Enter 'exit' to quit:");
input = Console.ReadLine();
// ... 处理输入 ...
} while (input != "exit");
Console.WriteLine("Program terminated.");

你可以使用控制语句改变循环的正常执行流程。

  • break:立即终止最内层的循环,并将控制权转移到循环之后的语句。
  • continue:跳过当前迭代的其余部分,并继续进行循环的下一次迭代。
// `break` 和 `continue` 的示例
for (int i = 1; i <= 10; i++)
{
if (i % 2 != 0)
{
continue; // 跳过奇数
}
if (i > 8)
{
break; // 如果数字大于 8,则退出循环
}
Console.WriteLine(i); // 此行仅对小于等于 8 的偶数运行
}

输出:

2
4
6
8

当循环的条件永不为 false 时,就会发生无限循环。虽然有时对于持续运行的服务是故意的,但它们通常是一个错误。要创建故意的无限循环,while(true) 比 for(;;) 更具可读性。

在真实世界的应用程序(例如后台服务)中,无限循环应与优雅停机(graceful shutdown)机制(例如 CancellationToken)结合使用,以允许循环安全地停止。