C#針對迴圈提供了一種新的形式:foreach,它和.NET架構中的集合介面密切聯絡。我們在程式中,應該優先使用foreach進行迴圈。
來看下面的程式碼片段
代碼
1 int [] foo = new int[100];
2
3 // Loop 1:
4 foreach ( int i in foo)
5 Console.WriteLine( i.ToString( ));
6
7 // Loop 2:
8 for ( int index = 0;
9 index < foo.Length;
10 index++ )
11 Console.WriteLine( foo[index].ToString( ));
12
13 // Loop 3:
14 int len = foo.Length;
15 for ( int index = 0;
16 index < len;
17 index++ )
18 Console.WriteLine( foo[index].ToString( ));
19
20
上述代碼提供了三種迴圈的方式,就執行效率來說,第一種採用foreach的方式,效率最高;第二種採用for的方式,效率次之;第三種將數組的length屬性放置到for迴圈外面,是效率最低的。
C#代碼運行在一個託管的環境中,程式使用的每一個記憶體都會被檢查,這檢查就包含了針對數組下標的檢查,上述第三種迴圈方式,其實相當於下面的代碼。
代碼
1 // Loop 3, as generated by compiler:
2 int len = foo.Length;
3 for ( int index = 0;
4 index < len;
5 index++ )
6 {
7 if ( index < foo.Length )
8 Console.WriteLine( foo[index].ToString( ));
9 else
10 throw new IndexOutOfRangeException( );
11 }
將Length放到for迴圈之外,只會讓JIT編譯器做更多的工作,產生的代碼也更慢。在迴圈的每一次迭代的過程中,程式都要對數組下標是否越界進行檢查。
我們之所以優先考慮foreach迴圈,可以從以下幾方面考慮。
- 效能,上面已經說了。
- 使用習慣,可能有人習慣數組下標從1開始,而不是從0開始,這樣的話,如果使用for迴圈,就會很麻煩,但是foreach是沒有這個煩惱的。
- 對於多維陣列,使用for迴圈的方式,需要寫很多層for語句,而foreach直接一層就可以了。
- foreach迴圈的方式,在每一次迭代的過程中,是不可以對迭代的內容進行修改的,這樣可以阻止一些誤操作的發生。
- 如果我們定義的結構發生變化,例如從數組變為ArrayList,那麼對於foreach迴圈來說,是不需要修改調用代碼的,但是對於for迴圈來說,需要修改調用代碼,這部分的工作量是很繁瑣的。
因此,foreach是一個非常有用的語句,它會使用最高效的構造為“數組的上下界索引”、“多維陣列遍曆”和“運算元轉型”產色號那個正確的代碼,並且產生的是最具效率的迴圈結構,它是遍曆集合的最佳方式。