<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    mp3--baidu.

    Google 搜索

    夢想不只是做夢想一想

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


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

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

            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語句很簡潔,但是它的優點不僅僅在于此,它的效率也是最高的。可能很多人認為最后一種的效率會更高,因為表面上看著不用每次訪問引用類型的屬性。可是它卻是三者當中,效率最低的。因為C#是強類型檢查,那么對于數組訪問的時候,要對索引的有效值進行判斷,那么對于最后一種代碼實際產生的效果如同下面的代碼一樣。

            // 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();

            }

    (書中這里有些出入,經過網友sozdream的提示,在1.1環境下發現最后一種方法是最快的,前兩者的速度基本相等;通過Dissambly查看最后一種循環方法所產生的代碼,并沒有產生類似于文章所說的那種索引檢查。不過還是不建議使用最后一種,因為此方法對索引的判斷有些脫節,尤其是當循環中數組尺寸發生變化的時候,索引有效檢查無法及時進行)

     

    foreach語句除了簡潔和高效外,還有很多優點,接下來一一列舉。

     

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

     

    第二個好處就是對于多維數組操作用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語句不用發生任何變化,而對于for語句來說就要進行修改了,這里就不多說了。

     

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

            // 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接口的類型數據,才能使用foreach語句,那么對于使用foreach會訪問IEnumerable接口中GetEnumerator方法來進行枚舉,那么對于如上的foreach語句,對應的語句其實如下:

            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的對象也進行Dispose處理。

     

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

            // 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() );

            }

     

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

            // 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() );

            }

     

    除了這兩個地方外,foreach可以基本適用于任何循環,因此對于循環的編寫要盡量使用foreach,因為它會使你的代碼清晰簡潔,又不失高效。



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


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


    網站導航:
     
    主站蜘蛛池模板: 亚洲日韩在线中文字幕第一页| 99爱在线精品免费观看| 亚洲国产精品嫩草影院久久| 精品亚洲视频在线| 免费一看一级毛片人| 污污视频免费观看网站| 久久乐国产精品亚洲综合| 中文在线观看永久免费| 亚洲成AV人片在线观看WWW| 91青青国产在线观看免费| 亚洲精品午夜在线观看| 欧美a级成人网站免费| 亚洲高清毛片一区二区| 免费在线观看黄网| jizz日本免费| 亚洲四虎永久在线播放| 免费国产成人高清在线观看网站| 亚洲精品第一国产综合亚AV| 免费在线观看黄网| 久久久免费的精品| 亚洲最大av资源站无码av网址| 日本高清免费aaaaa大片视频| 国产亚洲精品美女久久久久| 亚洲色婷婷综合久久| 免费v片在线观看视频网站| 亚洲国产成人精品无码区花野真一| 亚洲日韩人妻第一页| 最近免费中文字幕mv在线电影| 一本色道久久综合亚洲精品蜜桃冫| 又粗又硬又黄又爽的免费视频| 182tv免费视频在线观看 | 国产免费人成在线视频| 四虎国产精品免费永久在线| 亚洲精品免费在线| 亚洲国产精品无码久久九九| 中文字幕免费在线| 理论秋霞在线看免费| 亚洲无删减国产精品一区| 嫩草影院在线免费观看| 日韩免费高清播放器| 亚洲AV永久无码精品一福利|