转自:http://www.cnblogs.com/Terry-greener/archive/2011/10/27/2226179.html
foreach (var a in GetList())
{
...
}
=
var a;
IEnumerator e = GetList().GetEnumerator();
while (e.MoveNext)
{
a = e.Current;
}
foreach 依赖 IEnumerable,第一次 var a in GetList() 时 调用 GetEnumerator 返回第一个对象 并 赋给a,以后每次再执行 var a in GetList() 的时候 调用 MoveNext.直到循环结束.
期间GetList()方法只执行一次.for 循环靠下标定位. list[3] 相当于 *(list + 3).
for(int i = 0; i < GetCount(); i++)
{
....
}
=
int i = 0;
while(i < GetCount())
{
...
}
总结
- 在固定长度或长度不需要计算的时候for循环效率高于foreach.
- 在不确定长度,或计算长度有性能损耗的时候,用foreach比较方便
- 并且foreach的时候会锁定集合中的对象.期间不能修改.
另外一种说法:
- 对于数组的访问,是应该使用for的方式的,因为这样性能更高
- 由于Enumerator中,做了版本检查处理的工作,所以使用foreach是线程安全
- 对本地变量,则使用for,效率和安全兼顾
- 在一些全局的,多线程可以访问的数据结构对象,使用foreach