1. 程式人生 > >c# for 和 foreach 的區別

c# for 和 foreach 的區別

pan copy strong string each 標定 lba log 實現

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).

技術分享
for(int i = 0; i < GetCount(); i++)
{
  ....
}

=

int i = 0;

while(i < GetCount())
{
  ...
}
技術分享

for 循環每次循環會調用 GetCount() 來比較長度. 而 foreach 不考慮長度,只調用一次GetList().

結論.

在固定長度或長度不需要計算的時候for循環效率高於foreach.

在不確定長度,或計算長度有性能損耗的時候,用foreach比較方便.

並且foreach的時候會鎖定集合中的對象.期間不能修改.

c# for 和 foreach 的區別