Effective C# Item11:優先採用foreach迴圈語句

來源:互聯網
上載者:User

    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. 效能,上面已經說了。
  2. 使用習慣,可能有人習慣數組下標從1開始,而不是從0開始,這樣的話,如果使用for迴圈,就會很麻煩,但是foreach是沒有這個煩惱的。
  3. 對於多維陣列,使用for迴圈的方式,需要寫很多層for語句,而foreach直接一層就可以了。
  4. foreach迴圈的方式,在每一次迭代的過程中,是不可以對迭代的內容進行修改的,這樣可以阻止一些誤操作的發生。
  5. 如果我們定義的結構發生變化,例如從數組變為ArrayList,那麼對於foreach迴圈來說,是不需要修改調用代碼的,但是對於for迴圈來說,需要修改調用代碼,這部分的工作量是很繁瑣的。

    因此,foreach是一個非常有用的語句,它會使用最高效的構造為“數組的上下界索引”、“多維陣列遍曆”和“運算元轉型”產色號那個正確的代碼,並且產生的是最具效率的迴圈結構,它是遍曆集合的最佳方式。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.