跳到主要内容

C# 控制流

本章将介绍 C# 中的条件语句和循环结构。

条件语句

if-else 语句

int score = 85;

// 基本 if 语句
if (score >= 60)
{
Console.WriteLine("及格");
}

// if-else
if (score >= 60)
{
Console.WriteLine("及格");
}
else
{
Console.WriteLine("不及格");
}

// if-else if-else
if (score >= 90)
{
Console.WriteLine("优秀");
}
else if (score >= 80)
{
Console.WriteLine("良好");
}
else if (score >= 70)
{
Console.WriteLine("中等");
}
else if (score >= 60)
{
Console.WriteLine("及格");
}
else
{
Console.WriteLine("不及格");
}

简化的条件表达式

// 三元运算符
string result = score >= 60 ? "及格" : "不及格";

// 嵌套三元(不推荐)
string grade = score >= 90 ? "A" : (score >= 80 ? "B" : (score >= 70 ? "C" : "D"));

switch 语句

int day = 3;
string dayName;

switch (day)
{
case 1:
dayName = "星期一";
break;
case 2:
dayName = "星期二";
break;
case 3:
dayName = "星期三";
break;
case 4:
dayName = "星期四";
break;
case 5:
dayName = "星期五";
break;
case 6:
dayName = "星期六";
break;
case 7:
dayName = "星期日";
break;
default:
dayName = "无效";
break;
}

Console.WriteLine(dayName);

switch 表达式(C# 8+)

// 使用箭头语法
string dayName = day switch
{
1 => "星期一",
2 => "星期二",
3 => "星期三",
4 => "星期四",
5 => "星期五",
6 => "星期六",
7 => "星期日",
_ => "无效"
};

// 带条件的多值匹配
string category = score switch
{
>= 90 => "A",
>= 80 => "B",
>= 70 => "C",
>= 60 => "D",
_ => "F"
};

// 使用元组匹配(C# 8+)
(string mode, int speed) = ("fast", 100);
string result = (mode, speed) switch
{
("slow", _) => "低速模式",
("fast", var s) when s > 80 => "高速模式",
_ => "普通模式"
};

switch 模式匹配(C# 9+)

object obj = "Hello";

// 类型模式匹配
switch (obj)
{
case int i:
Console.WriteLine($"整数: {i}");
break;
case string s:
Console.WriteLine($"字符串: {s}");
break;
case null:
Console.WriteLine("null");
break;
default:
Console.WriteLine("其他类型");
break;
}

// 带条件的模式匹配
object shape = new Circle { Radius = 5 };
string description = shape switch
{
Circle c when c.Radius > 10 => "大圆",
Circle c => "圆",
Rectangle r when r.Width == r.Height => "正方形",
Rectangle => "矩形",
_ => "未知形状"
};

循环语句

for 循环

// 基本 for 循环
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i); // 输出 0, 1, 2, 3, 4
}

// 倒序循环
for (int i = 5; i > 0; i--)
{
Console.WriteLine(i); // 输出 5, 4, 3, 2, 1
}

// 步长为2的循环
for (int i = 0; i < 10; i += 2)
{
Console.WriteLine(i); // 输出 0, 2, 4, 6, 8
}

foreach 循环

// 遍历数组
int[] numbers = { 1, 2, 3, 4, 5 };
foreach (int num in numbers)
{
Console.WriteLine(num);
}

// 遍历字符串(逐字符)
string text = "Hello";
foreach (char c in text)
{
Console.WriteLine(c);
}

// 遍历集合
var list = new List<string> { "a", "b", "c" };
foreach (var item in list)
{
Console.WriteLine(item);
}

while 循环

// while:先判断后执行
int i = 0;
while (i < 5)
{
Console.WriteLine(i);
i++;
}

// do-while:先执行后判断
int j = 0;
do
{
Console.WriteLine(j);
j++;
} while (j < 5);

无限循环

// while 无限循环
while (true)
{
// 业务逻辑
if (condition)
break; // 退出循环
}

// for 无限循环
for (; ; )
{
if (condition)
break;
}

跳转语句

break 语句

// 跳出当前循环
for (int i = 0; i < 10; i++)
{
if (i == 5)
break; // i 为 5 时退出循环
Console.WriteLine(i);
}

continue 语句

// 跳过本次循环,继续下一次
for (int i = 0; i < 5; i++)
{
if (i == 2)
continue; // 跳过 i=2 的这次循环
Console.WriteLine(i); // 输出 0, 1, 3, 4
}

return 语句

// 在方法中退出
int FindIndex(int[] arr, int target)
{
for (int i = 0; i < arr.Length; i++)
{
if (arr[i] == target)
return i; // 找到就返回
}
return -1; // 未找到
}

goto 语句(不推荐使用)

// 跳转到标签(尽量避免使用)
int choice = 2;
switch (choice)
{
case 1:
goto case 2; // 跳到 case 2
case 2:
Console.WriteLine("执行 case 2");
break;
default:
goto label;

}
label:
Console.WriteLine("默认处理");

循环中的异常处理

// 使用 break 退出多重循环
bool found = false;
for (int i = 0; i < 10 && !found; i++)
{
for (int j = 0; j < 10; j++)
{
if (i * j == 42)
{
Console.WriteLine($"找到: i={i}, j={j}");
found = true;
break; // 跳出内层循环
}
}
}

// 或者使用 goto
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
if (i * j == 42)
{
goto Found;
}
}
}
Found:
Console.WriteLine("找到");

实用示例

计算阶乘

// 使用 for 循环
int Factorial(int n)
{
int result = 1;
for (int i = 2; i <= n; i++)
{
result *= i;
}
return result;
}

Console.WriteLine(Factorial(5)); // 120

遍历二维数组

int[,] matrix = {
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};

foreach (int value in matrix)
{
Console.Write(value + " ");
}
// 输出: 1 2 3 4 5 6 7 8 9

// 使用嵌套 for 循环(带索引)
for (int i = 0; i < matrix.GetLength(0); i++)
{
for (int j = 0; j < matrix.GetLength(1); j++)
{
Console.WriteLine($"[{i},{j}] = {matrix[i, j]}");
}
}

猜数字游戏

Random random = new Random();
int target = random.Next(1, 101);
int guess;
int attempts = 0;

Console.WriteLine("猜数字游戏(1-100)");

do
{
Console.Write("请输入猜测: ");
guess = int.Parse(Console.ReadLine());
attempts++;

if (guess > target)
Console.WriteLine("太大了!");
else if (guess < target)
Console.WriteLine("太小了!");
else
Console.WriteLine($"恭喜!猜对了!你用了 {attempts} 次。");

} while (guess != target);

小结

  1. 条件语句:if-else、switch-case、switch 表达式
  2. 循环语句:for、foreach、while、do-while
  3. 跳转语句:break、continue、return、goto
  4. 模式匹配:C# 9+ 的类型模式和关系模式

练习

  1. 编写一个程序,判断输入的年份是否为闰年
  2. 使用 for 循环打印九九乘法表
  3. 编写一个程序,计算 Fibonacci 数列前 N 项
  4. 实现一个简单的猜数字游戏(带次数限制)