mp3--baidu.

          Google 搜索

          夢想不只是做夢想一想

          青青子衿, 悠悠我心, 但為君故, 沉吟至今
          posts - 1, comments - 0, trackbacks - 0, articles - 422
             :: 首頁 ::  :: 聯(lián)系 :: 聚合  :: 管理


          http://blog.csdn.net/guolei0451/article/details/1301884

             循環(huán)語句是編程的基本語句,在
          C#中除了沿用C語言的循環(huán)語句外,還提供了foreach語句來實(shí)現(xiàn)循環(huán)。那么我要說的就是,在循環(huán)操作中盡量使用foreach語句來實(shí)現(xiàn)。為了來更好地說明為什么要提倡使用foreach,用如下三種不同方式來編寫循環(huán)語句。

                  int[] nArray = new int[100];

           

                  // Use "foreach" to loop array

                  foreach( int i in nArray )

                      Debug.WriteLine( i.ToString() );

           

                  // Use "for" to loop array

                  for( int i = 0; i < nArray.Length; i++ )

                      Debug.WriteLine( nArray[i].ToString() );

           

                  // Another way using "for" to loop array

                  int nLength = nArray.Length;

                  for( int i = 0; i < nLength; i++ )

                      Debug.WriteLine( nArray[i].ToString() );

           

          很明顯,foreach語句很簡潔,但是它的優(yōu)點(diǎn)不僅僅在于此,它的效率也是最高的。可能很多人認(rèn)為最后一種的效率會更高,因?yàn)楸砻嫔峡粗挥妹看卧L問引用類型的屬性。可是它卻是三者當(dāng)中,效率最低的。因?yàn)?/span>C#是強(qiáng)類型檢查,那么對于數(shù)組訪問的時(shí)候,要對索引的有效值進(jìn)行判斷,那么對于最后一種代碼實(shí)際產(chǎn)生的效果如同下面的代碼一樣。

                  // Another way using "for" to loop array

                  int nLength = nArray.Length;

                  for( int i = 0; i < nLength; i++ )

                  {

                      if( i < nArray.Length )

                          Debug.WriteLine( nArray[i].ToString() );

                      else

                          throw new IndexOutOfRangeException();

                  }

          (書中這里有些出入,經(jīng)過網(wǎng)友sozdream的提示,在1.1環(huán)境下發(fā)現(xiàn)最后一種方法是最快的,前兩者的速度基本相等;通過Dissambly查看最后一種循環(huán)方法所產(chǎn)生的代碼,并沒有產(chǎn)生類似于文章所說的那種索引檢查。不過還是不建議使用最后一種,因?yàn)榇朔椒▽λ饕呐袛嘤行┟摴?jié),尤其是當(dāng)循環(huán)中數(shù)組尺寸發(fā)生變化的時(shí)候,索引有效檢查無法及時(shí)進(jìn)行)

           

          foreach語句除了簡潔和高效外,還有很多優(yōu)點(diǎn),接下來一一列舉。

           

          第一個(gè)就是不用考慮數(shù)組起始索引是幾,很多人可能從其他語言轉(zhuǎn)到C#的,那么原先語言的起始索引可能不是1,例如VB或者Delphi語言,那么在C#中使用數(shù)組的時(shí)候就難免疑問到底使用0開始還是用1開始呢,那么使用foreach就可以避免這類問題。

           

          第二個(gè)好處就是對于多維數(shù)組操作用foreach就非常簡便了,例如:

                  int[,] nVisited = new int[8,8];

                  // Use "for" to loop two-dimension array

                  for( int i = 0; i < nVisited.GetLength(0); i++ )

                      for( int j = 0; j < nVisited.GetLength( 1 ); j++ )

                          Debug.WriteLine( nVisited[i,j].ToString() );

           

                  // Use "foreach" to loop two-dimension array

                  foreach( int i in nVisited )

                      Debug.WriteLine( i.ToString() );

           

          對于三維或更多維,foreach語句不用發(fā)生任何變化,而對于for語句來說就要進(jìn)行修改了,這里就不多說了。

           

          第三個(gè)要說的就是foreach完成類型轉(zhuǎn)換操作,這種體現(xiàn)可能通過如上的例子看不出任何效果,但是對于ArrayList之類的數(shù)據(jù)集來說,這種操作就顯得比較突出,例如:

                  // Init an arraylist object

                  int[] nArray = new int[100];

                  ArrayList arrInt = new ArrayList();

                  arrInt.AddRange( nArray );

           

                  // Use "foreach" to loop an arraylist

                  foreach( int i in arrInt )

                      Debug.WriteLine( i.ToString() );

           

                  // Use "for" to loop an arraylist

                  for( int i = 0; i < arrInt.Count; i++ )

                  {

                      int n = ( int ) arrInt[i];

                      Debug.WriteLine( n.ToString() );

                  }

           

          最后要說的是使用foreach并沒有增加資源使用,這句話聽得有些難懂,由于對于繼承了IEnumerable接口的類型數(shù)據(jù),才能使用foreach語句,那么對于使用foreach會訪問IEnumerable接口中GetEnumerator方法來進(jìn)行枚舉,那么對于如上的foreach語句,對應(yīng)的語句其實(shí)如下:

                  IEnumerator it = arrInt.GetEnumerator() as IEnumerator;

                  using( IDisposable disp = it as IDisposable )

                  {

                      while( it.MoveNext() )

                      {

                          int elem = ( int )it.Current;

                          Debug.WriteLine( elem.ToString() );

                      }

                  }

           

          也就是說在出了foreach之后對于IEnumerator的對象也進(jìn)行Dispose處理。

           

          對于foreach說了這么多好處,那么在使用它是否可以無懈可擊呢。其實(shí)不是這樣的,foreach語句中有兩個(gè)限制,第一不能修改枚舉成員,其次不要對集合進(jìn)行刪除操作。也就是如下兩種方式都是錯(cuò)誤的。

                  // Use "foreach" to loop an arraylist

                  foreach( int i in arrInt )

                  {

                      i++;//Can't be compiled

                      Debug.WriteLine( i.ToString() );

                  }

           

                  // Use "foreach" to loop an arraylist

                  foreach( int i in arrInt )

                  {

                      arrInt.Remove( i );//It will generate error in run-time

                      Debug.WriteLine( i.ToString() );

                  }

           

          那么對于如上兩個(gè)操作,可以用for來實(shí)現(xiàn),此外這里多說一句,就是對于一個(gè)記錄集的多條數(shù)據(jù)刪除問題,也是經(jīng)常出現(xiàn)問題的地方(論壇上經(jīng)常問類似的問題),由于在一些記錄集中進(jìn)行刪除的時(shí)候,在刪除操作之后相應(yīng)的索引也發(fā)生了變化,這時(shí)候的刪除要反過來進(jìn)行刪除,大致形式如下。

                  // Use "for" to loop an arraylist

                  for( int i = arrInt.Count - 1; i >=0; i-- )

                  {

                      int n = ( int ) arrInt[i];

                      if( n == 5 )

                          arrInt.RemoveAt( i ); // Remove data here

                      Debug.WriteLine( n.ToString() );

                  }

           

          除了這兩個(gè)地方外,foreach可以基本適用于任何循環(huán),因此對于循環(huán)的編寫要盡量使用foreach,因?yàn)樗鼤鼓愕拇a清晰簡潔,又不失高效。



          Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1100236


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          主站蜘蛛池模板: 河北省| 麟游县| 榆林市| 治县。| 平果县| 乌什县| 柯坪县| 新巴尔虎右旗| 岐山县| 柳江县| 江山市| 天祝| 宁化县| 纳雍县| 黄山市| 博湖县| 吴江市| 景谷| 余姚市| 灵川县| 宽甸| 吉林市| 衡山县| 武山县| 繁峙县| 宁国市| 浦城县| 高青县| 金溪县| 周宁县| 满洲里市| 乐平市| 准格尔旗| 满城县| 怀仁县| 华阴市| 博爱县| 环江| 通山县| 门头沟区| 黔西县|