foreach的本质
在C#中Foreach是一种非常方便的遍历集合的方式,但是在C这样的语言中,基本的循环语句并没有foreach的身影,所以foreach对于C#而言是一种封装了的用于遍历集合的方式,以下就分析下原理:
对于Foreach而言,本质上执行的是一个while()循环,所以可以理解为等效代码,但是只有while是无法完成的,还需要对集合做一些限定,主要内容包括:
1.实现IEnumerable接口,用于生成枚举器;
2.实现IEnumerator接口,用于实现枚举器;
具体的接口定义如下:
interface IEnumerable
{
IEnumerator GetEnumerator();
}
interface IEnumerator
{
object Current{get;}
bool MoveNext();
Void Reset();
}
对应上面两个接口也都提供了对应的泛型方法,就不列举了。基本的数据集合都实现了上面两个接口,或者说想要使用foreach必须得是实现了上面两个接口的集合。所以如果我们自定义一种集合,也可以手动实现枚举器。
而foreach真正实现的话就像下面的过程:
foreach(datap in datas){
}
.net编译后,实际的代码应该是这样的,
IEnumerator tor=datas.GetEnumerator()
while(tor.MoveNext())
{
具体语句体
}