一、C# foreach语句
foreach语句能够对实现Ienumerable接口的容器进行遍历,并提供一个枚举器来实现Ienumerable接口。foreach语句为数组或对象集合中的各个元素执行一个嵌入语句组。
另外,它还可用于循环访问集合以获取所需信息,但不能应用于更改集合内容以避免产生不可预知的副作用。
语法格式如下:
foreach(type identifier in expression)
{
embedded-statement
}
type(类型)和identifier(标识符)用于声明循环变量,expression(表达式)对应集合。
每执行一次内嵌语句,循环变量就依次取集合中的一个元素代入其中。在这里,循环变量是一个只读型局部变量,如果试图改变它的值或将它作为一个ref或out类型的参数传递,都将引发编译时错误。
foreach语句中的expression必须是集合类型,如果该集合的元素类型与循环变量类型不一致,则必须有一个显式定义的从集合中的元素类型到循环变量元素类型的显式转换。
foreach语句的执行顺序如下:
(1)计算集合表达式的值并生成一种集合类型的实例。
(2)调用集合的GetEnumerator方法得到一个枚举实例的值,返回的枚举值将存放在一个临时局部变量中。
(3)调用临时局部变量的MoveNext方法,以获取下一个枚举元素。
(4)如果MoveNext方法的返回值为false,则表明已为集合中的所有元素完成循环,控制传递给foreach块后的下一条语句,否则继续执行。
(5)计算临时局部变量的Current属性以获取当前枚举值并将其转换为foreach语句中规定的变量类型,并将结果存储在迭代变量中,以便在循环体内可以访问该变量的值。
(6)执行循环体包含的语句,然后转到第(3)步开始下一轮循环。
二、提示
C#中集合类型的定义:
?集合类型必须支持一个形为GetEnumerator()的公有的非静态方法,该方法的返回类型为结构、类或接口。
?形为GetEnumerator()的方法返回的结构、类或接口应当包含一个公有的非静态的方法MoveNext(),该方法的返回类型为布尔型。
?形为GetEnumerator()的方法返回的结构、类或接口应当包含一个公有的非静态的属性Current,该属性可以读出。
如果一个类型同时满足以上三个条件,该类型称为集合类型。Current属性的类型叫做该集合类型的元素类型。
foreach语句也支持数组类型,对于一维数组,执行顺序是从下标为0的元素开始,一直到数组的最后一个元素;对于多维数组,元素下标的递增是从最右边那一维开始的,依次类推。
同样,break和continue可以出现在foreach语句中,功能不变。
三、示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test
{
class Program
{
static void Main(string[] args)
{
// C# foreach语句-www.baike369.com
int[] array = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Console.Write("数组元素的值为:");
foreach (int elementArray in array)
{
Console.Write("{0} ", elementArray);
}
Console.ReadLine();
}
}
}
运行结果:
数组元素的值为:0 1 2 3 4 5 6 7 8 9