# 语句 ## 迭代语句 以下语句重复执行语句或语句块: - [`for` 语句](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/statements/iteration-statements#the-for-statement):在指定的布尔表达式的计算结果为 `true` 时会执行其主体。 - [`foreach` 语句](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/statements/iteration-statements#the-foreach-statement):枚举集合元素并对集合中的每个元素执行其主体。 - [`do` 语句](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/statements/iteration-statements#the-do-statement):有条件地执行其主体一次或多次。 - [`while` 语句](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/statements/iteration-statements#the-while-statement):有条件地执行其主体零次或多次。 在迭代语句的主体中的任何点上,可以使用 [break](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/break) 语句中断循环,或者可以使用 [continue](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/continue) 语句继续执行到循环中的下一次迭代。 ### for语句 在指定的布尔表达式的计算结果为 `true` 时,`for` 语句会执行一条语句或一个语句块。 ```csharp for (int i = 0; i < 3; i++) { Console.Write(i); } // Output: // 012 ``` ### foreach 语句 `foreach` 语句为类型实例中实现 [System.Collections.IEnumerable](https://docs.microsoft.com/zh-cn/dotnet/api/system.collections.ienumerable) 或 [System.Collections.Generic.IEnumerable](https://docs.microsoft.com/zh-cn/dotnet/api/system.collections.generic.ienumerable-1) 接口的每个元素执行语句或语句块,如以下示例所示: ```csharp var fibNumbers = new List { 0, 1, 1, 2, 3, 5, 8, 13 }; foreach (int element in fibNumbers) { Console.Write($"{element} "); } // Output: // 0 1 1 2 3 5 8 13 ``` #### await foreach 从 C# 8.0 开始,可以使用 `await foreach` 语句来使用异步数据流,即实现 [IAsyncEnumerable](https://docs.microsoft.com/zh-cn/dotnet/api/system.collections.generic.iasyncenumerable-1) 接口的集合类型。 异步检索下一个元素时,可能会挂起循环的每次迭代。 下面的示例演示如何使用 `await foreach` 语句: ```csharp await foreach (var item in GenerateSequenceAsync()) { Console.WriteLine(item); } ``` ### do语句 在指定的布尔表达式的计算结果为 `true` 时,`do` 语句会执行一条语句或一个语句块。 由于在每次执行循环之后都会计算此表达式,所以 `do` 循环会执行一次或多次。 这不同于 [while](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/statements/iteration-statements#the-while-statement) 循环(该循环执行零次或多次)。 ```csharp int n = 0; do { Console.Write(n); n++; } while (n < 5); // Output: // 01234 ``` ### while语句 在指定的布尔表达式的计算结果为 `true` 时,`while` 语句会执行一条语句或一个语句块。 由于在每次执行循环之前都会计算此表达式,所以 `while` 循环会执行零次或多次。 这不同于 [do](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/statements/iteration-statements#the-do-statement) 循环,该循环执行一次或多次。 ```csharp int n = 0; while (n < 5) { Console.Write(n); n++; } // Output: // 01234 ``` ## 选择语句 下面的选择语句是从多个可能的语句中选择一条符合条件的来执行: - if语句 - switch语句 ### if语句 > if语句可以是一下两种形式的任何一种 - 带else字句的if语句,根据bool表达式选择一个分支执行,如下例所示: ```csharp DisplayWeatherReport(15.0); // Output: Cold. DisplayWeatherReport(24.0); // Output: Perfect! void DisplayWeatherReport(double tempInCelsius) { if (tempInCelsius < 20.0) { Console.WriteLine("Cold."); } else { Console.WriteLine("Perfect!"); } } ``` - 只有if语句没有else字句 ```csharp DisplayMeasurement(45); // Output: The measurement value is 45 DisplayMeasurement(-3); // Output: Warning: not acceptable value! The measurement value is -3 void DisplayMeasurement(double value) { if (value < 0 || value > 100) { Console.Write("Warning: not acceptable value! "); } Console.WriteLine($"The measurement value is {value}"); } ``` 可以嵌套多个if语句来检查多个条件,如下例所示: ```csharp DisplayCharacter('f'); // Output: A lowercase letter: f DisplayCharacter('R'); // Output: An uppercase letter: R DisplayCharacter('8'); // Output: A digit: 8 DisplayCharacter(','); // Output: Not alphanumeric character: , void DisplayCharacter(char ch) { if (char.IsUpper(ch)) { Console.WriteLine($"An uppercase letter: {ch}"); } else if (char.IsLower(ch)) { Console.WriteLine($"A lowercase letter: {ch}"); } else if (char.IsDigit(ch)) { Console.WriteLine($"A digit: {ch}"); } else { Console.WriteLine($"Not alphanumeric character: {ch}"); } } ``` ### switch语句 switch语句是从多个语句分支中根据表达式选择符合条件的语句执行,如下所示: ```csharp DisplayMeasurement(-4); // Output: Measured value is -4; too low. DisplayMeasurement(5); // Output: Measured value is 5. DisplayMeasurement(30); // Output: Measured value is 30; too high. DisplayMeasurement(double.NaN); // Output: Failed measurement. void DisplayMeasurement(double measurement) { switch (measurement) { case < 0.0: Console.WriteLine($"Measured value is {measurement}; too low."); break; case > 15.0: Console.WriteLine($"Measured value is {measurement}; too high."); break; case double.NaN: Console.WriteLine("Failed measurement."); break; default: Console.WriteLine($"Measured value is {measurement}."); break; } } ```