迭代语句

您所在的位置:网站首页 for语句如何循环 迭代语句

迭代语句

2023-10-25 18:13| 来源: 网络整理| 查看: 265

迭代语句 - for、foreach、do 和 while 项目 04/07/2023

此迭代语句重复执行语句或语句块。 for 语句:在指定的布尔表达式的计算结果为 true 时会执行其主体。 foreach 语句:枚举集合元素并对集合中的每个元素执行其主体。 do 语句:有条件地执行其主体一次或多次。 while 语句:有条件地执行其主体零次或多次。

在迭代语句体中的任何点,都可以使用 break 语句跳出循环。 可以使用 continue 语句进入循环中的下一个迭代。

for 语句

在指定的布尔表达式的计算结果为 true 时,for 语句会执行一条语句或一个语句块。 以下示例显示了 for 语句,该语句在整数计数器小于 3 时执行其主体:

for (int i = 0; i < 3; i++) { Console.Write(i); } // Output: // 012

上述示例展示了 for 语句的元素:

“初始化表达式”部分仅在进入循环前执行一次。 通常,在该部分中声明并初始化局部循环变量。 不能从 for 语句外部访问声明的变量。

上例中的“初始化表达式”部分声明并初始化整数计数器变量:

int i = 0

“条件”部分确定是否应执行循环中的下一个迭代。 如果计算结果为 true 或不存在,则执行下一个迭代;否则退出循环。 “条件”部分必须为布尔表达式。

上例中的“条件”条件部分检查计数器值是否小于 3:

i < 3

“迭代器”部分定义循环主体的每次执行后将执行的操作。

上例中的“迭代器”部分增加计数器:

i++

循环体,必须是一个语句或一个语句块。

“迭代器”部分可包含用逗号分隔的零个或多个以下语句表达式:

为 increment 表达式添加前缀或后缀,如 ++i 或 i++ 为 decrement 表达式添加前缀或后缀,如 --i 或 i-- assignment 方法的调用 await表达式 通过使用 new 运算符来创建对象

如果未在“初始化表达式”部分中声明循环变量,则还可以在“初始化表达式”部分中使用上述列表中的零个或多个表达式。 下面的示例显示了几种不太常见的“初始化表达式”和“迭代器”部分的使用情况:为“初始化表达式”部分中的外部变量赋值、同时在“初始化表达式”部分和“迭代器”部分中调用一种方法,以及更改“迭代器”部分中的两个变量的值:

int i; int j = 3; for (i = 0, Console.WriteLine($"Start: i={i}, j={j}"); i < j; i++, j--, Console.WriteLine($"Step: i={i}, j={j}")) { //... } // Output: // Start: i=0, j=3 // Step: i=1, j=2 // Step: i=2, j=1

for 语句的所有部分都是可选的。 例如,以下代码定义无限 for 循环:

for ( ; ; ) { //... } foreach 语句

foreach 语句为类型实例中实现 System.Collections.IEnumerable 或 System.Collections.Generic.IEnumerable 接口的每个元素执行语句或语句块,如以下示例所示:

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

foreach 语句并不限于这些类型。 可以将其与满足以下条件的任何类型的实例一起使用:

类型具有公共无参数 GetEnumerator 方法。 从 C# 9.0 开始,GetEnumerator 方法可以是类型的扩展方法。 GetEnumerator 方法的返回类型具有公共 Current 属性和公共无参数 MoveNext 方法(其返回类型为 bool)。

下面的示例使用 foreach 语句,其中包含 System.Span 类型的实例,该实例不实现任何接口:

Span numbers = new int[] { 3, 14, 15, 92, 6 }; foreach (int number in numbers) { Console.Write($"{number} "); } // Output: // 3 14 15 92 6

如果枚举器的 Current 属性返回引用返回值(ref T,其中 T 为集合元素类型),就可以使用 ref 或 ref readonly 修饰符来声明迭代变量,如下面的示例所示:

Span storage = stackalloc int[10]; int num = 0; foreach (ref int item in storage) { item = num++; } foreach (ref readonly var item in storage) { Console.Write($"{item} "); } // Output: // 0 1 2 3 4 5 6 7 8 9

如果 foreach 语句的源集合为空,则 foreach 语句的正文不会被执行,而是被跳过。 如果 foreach 语句应用为 null,则会引发 NullReferenceException。

await foreach

可以使用 await foreach 语句来使用异步数据流,即实现 IAsyncEnumerable 接口的集合类型。 异步检索下一个元素时,可能会挂起循环的每次迭代。 下面的示例演示如何使用 await foreach 语句:

await foreach (var item in GenerateSequenceAsync()) { Console.WriteLine(item); }

还可以将 await foreach 语句与满足以下条件的任何类型的实例一起使用:

类型具有公共无参数 GetAsyncEnumerator 方法。 该方法可以是类型的扩展方法。 GetAsyncEnumerator 方法的返回类型具有公共 Current 属性和公共无参数 MoveNextAsync 方法(其返回类型为 Task、ValueTask 或任何其他可等待类型,其 awaiter 的 GetResult 方法返回 bool 值)。

默认情况下,在捕获的上下文中处理流元素。 如果要禁用上下文捕获,请使用 TaskAsyncEnumerableExtensions.ConfigureAwait 扩展方法。 有关同步上下文并捕获当前上下文的详细信息,请参阅使用基于任务的异步模式。 有关异步流的详细信息,请参阅异步流教程。

迭代变量的类型

可以使用 var 关键字让编译器推断 foreach 语句中迭代变量的类型,如以下代码所示:

foreach (var item in collection) { }

还可以显式指定迭代变量的类型,如以下代码所示:

IEnumerable collection = new T[5]; foreach (V item in collection) { }

在上述窗体中,集合元素的类型 T 必须可隐式或显式地转换为迭代变量的类型 V。 如果从 T 到 V 的显式转换在运行时失败,foreach 语句将引发 InvalidCastException。 例如,如果 T 是非密封类类型,则 V 可以是任何接口类型,甚至可以是 T 未实现的接口类型。 在运行时,集合元素的类型可以是从 T 派生并且实际实现 V 的类型。 如果不是这样,则会引发 InvalidCastException。

do 语句

在指定的布尔表达式的计算结果为 true 时,do 语句会执行一条语句或一个语句块。 由于在每次执行循环之后都会计算此表达式,所以 do 循环会执行一次或多次。 do 循环不同于 while 循环(该循环执行零次或多次)。

下面的示例演示 do 语句的用法:

int n = 0; do { Console.Write(n); n++; } while (n < 5); // Output: // 01234 while 语句

在指定的布尔表达式的计算结果为 true 时,while 语句会执行一条语句或一个语句块。 由于在每次执行循环之前都会计算此表达式,所以 while 循环会执行零次或多次。 while 循环不同于 do 循环(该循环执行 1 次或多次)。

下面的示例演示 while 语句的用法:

int n = 0; while (n < 5) { Console.Write(n); n++; } // Output: // 01234 C# 语言规范

有关更多信息,请参阅 C# 语言规范的以下部分:

for 语句 foreach 语句 do 语句 while 语句

有关 C# 8.0 及更高版本中添加的功能的详细信息,请参阅以下功能建议说明:

异步流 (C# 8.0) 扩展 GetEnumerator 支持 foreach 循环 (C# 9.0) 请参阅 C# 参考 迭代器


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3