if-else
条件判断语句,只有满足条件才能执行的函数体:
if (条件) { // 条件为 true 时执行 } else { // 条件为 false 时执行 }如果满足了条件就执行,否则的话就执行另一个函数体内的代码段:
int age = 18; if (age >= 18) { Console.WriteLine("已成年"); } else { Console.WriteLine("未成年"); }else也可以不写:
int score = 95; if (score >= 60) { Console.WriteLine("及格"); } // 如果不及格,什么也不做,直接跳过也可以通过else if 进行多条件分支语句的编写:
if (条件1) { // 条件1为 true } else if (条件2) { // 条件1为 false 且 条件2为 true } else if (条件3) { // 条件1、2为 false 且 条件3为 true } else { // 所有条件都为 false }同样的,if-else也可以嵌套:
bool isLoggedIn = true; bool isAdmin = false; if (isLoggedIn) { if (isAdmin) { Console.WriteLine("欢迎管理员"); } else { Console.WriteLine("欢迎普通用户"); } } else { Console.WriteLine("请先登录"); }if的参数必须是返回值为bool类型的,只是一个单独的左值或右值编译器时不允许的。
// ❌ 错误(C# 不允许这样写) if (5) { } // 编译错误 // ✅ 正确 if (5 > 3) { }else匹配的是同一作用域内上方最近的if,所以在编写过程中一定要用{}明确标明作用域,避免写错。
switch
switch语句基于单个变量的多个精确值进行的分支判断。相比于if-else链,switch可读性更高些、
int x = 5; if(x == 1) { } else if(x == 2) { } else if(x == 3) { } else if(x == 4) { } else { } switch(x) { case "1": break; case "2": break; case "3": break; case "4": break; default: }可以直观的看到switch的代码段更短,更简洁,更方便。
当条件是单个变量且有精确值匹配,分支数在3个以上的时候,用switch,如果不是单个变量且有精确值匹配,那分支数再多也不可以使用switch。
for
结构如下:
for (初始化; 条件; 迭代) { // 循环体 }初始化只会执行一次,每次循环前都要判断当前条件是否为true,只有为true才可以继续循环,否则退出循环。在执行完循环体后进行迭代,然后再进行下一次循环前判断。
简单示例:
// 打印 1 到 5 for (int i = 1; i <= 5; i++) { Console.WriteLine(i); } // 输出:1 2 3 4 5for可以省略部分参数,比如:
// 省略初始化(外部已定义) int i = 0; for (; i < 5; i++) { Console.WriteLine(i); } // 省略迭代(在循环体内处理) for (int i = 0; i < 5;) { Console.WriteLine(i); i++; // 手动迭代 } // 省略条件(死循环,需 break 退出) for (;;) { Console.WriteLine("无限循环"); break; // 必须退出 }for通常和数组搭配使用,通过for对数组中每一位元素进行遍历:
int[] numbers = { 10, 20, 30, 40, 50 }; // 使用索引访问 for (int i = 0; i < numbers.Length; i++) { Console.WriteLine($"numbers[{i}] = {numbers[i]}"); } // 输出: // numbers[0] = 10 // numbers[1] = 20 // ...for内也可以嵌套for,但是时间复杂度就会变成n*m:
for (int i = 1; i <= 9; i++) { for (int j = 1; j <= i; j++) { Console.Write($"{j}×{i}={i * j}\t"); } Console.WriteLine(); } // 输出: // 1×1=1 // 1×2=2 2×2=4 // 1×3=3 2×3=6 3×3=9 // ...for中可以使用break和continue进行循环控制,break是跳出整个循环语句:
// 找到第一个偶数就停止 for (int i = 1; i <= 10; i++) { if (i % 2 == 0) { Console.WriteLine($"找到偶数:{i}"); break; // 立即退出循环 } } // 输出:找到偶数:2continue是跳出本次循环,直接迭代后进入下次循环:
// 打印 1-10 中的所有奇数(跳过偶数) for (int i = 1; i <= 10; i++) { if (i % 2 == 0) continue; // 跳过本次循环 Console.Write(i + " "); } // 输出:1 3 5 7 9在使用for编写程序时要注意条件不要写错,不然可能无法进入循环或者变成死循环。
不建议使用浮点数作为计数器,因为浮点型可能会有误差,从而导致循环次数出错。
while
先判断条件,条件为true就执行循环体,条件为false就不执行。
int i = 1; while (i <= 5) { Console.WriteLine(i); i++; // 必须更新变量,否则死循环 } // 输出:1 2 3 4 5while通常用在不知道具体循环次数,只知道循环条件的时候。
do-while
至少执行一次循环,执行后在判断条件是否满足进入下一次循环。
do { // 循环体(至少执行一次) } while (条件);foreach
foreach (元素类型 变量名 in 集合) { // 处理每个元素 }执行流程:
1.从集合中取出第一个元素
2.赋值给变量
3.执行循环体
4.回到步骤1,取下一个元素
5.继续循环,直到所有元素遍历完。
举个简单的例子:
string[] fruits = { "Apple", "Banana", "Cherry" }; foreach (string fruit in fruits) { Console.WriteLine(fruit); } // 输出: // Apple // Banana // Cherryforeach在循环时不可以修改集合中的元素
int[] numbers = { 1, 2, 3, 4, 5 }; foreach (int num in numbers) { num = num * 2; // 编译错误!无法赋值 }foreach不需要手动管理索引,但也无法获取当前元素的索引位置。但可以用以下方法获取索引:
// C# 7.0+ 使用元组 var names = new List<string> { "Alice", "Bob", "Charlie" }; foreach (var (index, name) in names.Select((n, i) => (i, n))) { Console.WriteLine($"{index}: {name}"); } // 输出: // 0: Alice // 1: Bob // 2: Charlie // 或者使用索引变量手动增加 int idx = 0; foreach (var name in names) { Console.WriteLine($"{idx}: {name}"); idx++; }foreach支持所有实现了IEnumerable的的集合。
// 任何实现了 IEnumerable 的集合都可以用 foreach IEnumerable<int> numbers = GetNumbers(); // 假设返回 IEnumerable<int> foreach (int num in numbers) { Console.WriteLine(num); }