c# for 和 foreach 的区别

时间:2022-01-31 20:47:02

foreach

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

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

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

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

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

比如类型结构 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运行完毕。

 

for
for 循环靠下标定位.    list[3] 相当于 *(list + 3).

c# for 和 foreach 的区别
for(int i = 0; i < GetCount(); i++)
{
  ....
}

=

int i = 0;

while(i < GetCount())
{
  ...
}
c# for 和 foreach 的区别

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

 

结论.

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

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

 

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