程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 在foreach的判斷條件裡執行方法會有效率問題嗎?

在foreach的判斷條件裡執行方法會有效率問題嗎?

編輯:C#入門知識

樓豬平時一有空就有看別人代碼的習慣,從許多優秀規范的代碼中學習到了很多簡約高效的寫法和畫龍點睛的思想精華。但是有的時候也會覺得某些寫法很值得玩味。比如剛看到一段代碼,在foreach的條件判斷裡加了一個方法。樓豬一開始想當然地認為循環幾次,方法也會執行幾次,這樣肯定會有效率問題。但是看來看去還是不確定寫代碼的人為什麼要這麼寫,難道當時他不小心沒有注意到這個問題,抑或他rp正處低谷,抑或是他一時不負責任無緣無故就愛咋咋地了?!
毛主席教導我們“沒有調查就沒有發言權”;我D強調全社會要樹立科學發展觀。認識到問題的嚴重性,所以樓豬又在本地測試了一下:

\\代碼 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CSStudy
{
    class Program
    {
        private static int executeTimes = 0;

        static void Main(string[] args)
        {
            foreach (string item in CreateStrArr())//這裡調用CreateStrArr方法,CreateStrArr會執行多次嗎?
            {
                Console.WriteLine(item);
            }

            Console.WriteLine("As you see,method CreateStrArr execute times:{0}", executeTimes);

            Console.ReadKey();
        }

        static List<string> CreateStrArr()
        {
            executeTimes++;//記錄CreateStrArr方法到底跑了幾遍
            List<string> listResults = new List<string>();
            for (int i = 0; i < 5; i++)
            {
                listResults.Add((i + 1).ToString());
            }
            return listResults;
        }
    }

}

   測試結果印證了這個世界“不會有無緣無故的恨,當然也不會有無緣無故的愛”。正如測試結果顯示的那樣,CreateStrArr方法只跑了一遍,靜態方法CreateStrArr改成實例方法,效果一樣(原諒NC樓豬心裡陰暗,本來是鐵了心要看笑話的...),應該不會有效率問題,那個寫代碼的人可以笑了。
  失落的樓豬又查了一遍msdn,“foreach 語句為數組或對象集合中的每個元素重復一個嵌入語句組。foreach 語句用於循環訪問集合以獲取所需信息,但不應用於更改集合內容以避免產生不可預知的副作用.”,明顯沒有告訴我們為什麼示例中的foreach裡的方法只執行一次。又google了一下之後,終於發現原來是編譯時,編譯器對foreach做了優化。nnd,老以為rp出問題,原來是編譯器的魔法,服了。

附:找出表中某個字段的重復值

在之前的iBATIS.net文章裡我們提到一個person表:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved