c# for 和 foreach 的区别

foreach

可以进行foreach的类型结构,都必须实现IEnumerable接口。性能

IEnumerable接口,有一个GetEnumerator的方法,返回一个实现IEnumerator接口的对象。
IEnumerator接口,有Current只读属性,MoveNext方法,Reset方法。spa

第一次 var a in GetList() 时 调用 GetEnumerator 返回第一个对象 并 赋给a,code

之后每次再执行 var a in GetList() 的时候 调用 MoveNext.直到循环结束.对象

期间GetList()方法只执行一次.blog

好比类型结构 TestForeach 一个对象tf ,在进行foreach的时候,好比以下:接口

1 foreach(var a in tf)
2 {
3   console.writeLine(a.toString());
4 }

程序运行到var a in tf时,实际上,调用了TestForeach的GetEnumerator()方法,返回一个a,当运行完console.writeLine(a.toString());后,继续运行 var a in tf,实际上是调用了 上一次的a.MoveNext()放法,直到a.MoveNext=false foreach运行完毕。it

 

for
for 循环靠下标定位.    list[3] 至关于 *(list + 3).console

复制代码
for(int i = 0; i < GetCount(); i++)
{
  ....
}

=

int i = 0;

while(i < GetCount())
{
  ...
}
复制代码

for 循环每次循环会调用 GetCount() 来比较长度. 而 foreach 不考虑长度,只调用一次GetList().for循环

 

结论.class

在固定长度或长度不须要计算的时候for循环效率高于foreach.

在不肯定长度,或计算长度有性能损耗的时候,用foreach比较方便.

 

而且foreach的时候会锁定集合中的对象.期间不能修改.