[C#] 017.多數情況下使用Foreach進行迴圈列舉 (不可異動的資料組就使用Foreach確保內部不執行到)

讀【157個完美化C#的建議】一書的理解筆記 - 017

重點:何時用Foreach ? 要確保不會影響原資料時,可以使用Foreach確保資料使用的安全性
           如果要異動原始參考資料,仍需使用For

Github 代碼下載

流程說明
1. For 與 Foreach 4大差異
2. .Add()效能比較
3. Console輸出效能比較
4. 結論

1. For 與 Foreach 4大差異

有以下四點確定的差異

1. Foreach 具有自動將程式碼置入try-finally
2. Foreach 使用時,若型別內有繼承IDispose,會在迴圈結束後會自動使用Dispose方法
3. Foreach 不可以中途異動參考資料
4. Foreach 效能通常與For 差異不大

2. .Add()效能比較

我們執行以下代碼,進行生成Int 資料 3000000 筆,讓Foreach 與 For 進行遍歷進行.Add()

//存放基本資料
private static List<int> items = new List<int>();

private int MAKE_COUNT = 3000000;
//生成資料
for (int i = 0; i < MAKE_COUNT; i++)
{
     items.Add(i);
}

以下是進行比較的代碼

private void ReadPerformance()
{
    //遍歷差異
    textBox1.Text += $@"生成Int資料筆數(使用.Add()加入資料) : {MAKE_COUNT} 筆 == \r\n";
    
    List<int> temp = new List<int>();
    Stopwatch sw = new Stopwatch();
    sw.Start();

    //==以下為 foreach 遍歷
    foreach (var item in items)
    {
        temp.Add(item);
    }
    sw.Stop();
    //紀錄花費時間
    textBox1.AppendText($@"==> foreach 遍歷 : 花費時間:");
    textBox1.AppendText($"{sw.Elapsed.TotalSeconds.ToString()} \r\n");
    temp.Clear();
    //==以下為 for 遍歷
   
    sw.Restart();
    for (int i = 0; i < items.Count; i++)
    {
        temp.Add(i);
    }
    sw.Stop();
    //紀錄花費時間
    textBox1.AppendText($@"==> for 遍歷 : 花費時間:");
    textBox1.AppendText($"{sw.Elapsed.TotalSeconds.ToString()} \r\n");
}

以下是執行結果

  花費時間(秒)
 foreach 遍歷 13.0156751  
 for 遍歷 12.6775283 

3. Console輸出效能比較

以下是進行比較的代碼

private void ExcutePerformance()
{
    textBox1.Text += ($@"不使用.Add()加入資料 : \r\n");

    Stopwatch sw = new Stopwatch();
    sw.Start();
    //==以下為 foreach 遍歷
    foreach (var item in items)
    {
        Console.WriteLine(item);
    }
    sw.Stop();
    //紀錄花費時間
    textBox1.AppendText($@"==> foreach 遍歷 : 花費時間:");
    textBox1.AppendText($"{sw.Elapsed.TotalSeconds.ToString()} \r\n");

    //==以下為 for 遍歷
    sw.Restart();
    for (int i = 0; i < items.Count; i++)
    {
        Console.WriteLine(i);
    }
    sw.Stop();
    //紀錄花費時間
    textBox1.AppendText($@"==> for 遍歷 : 花費時間:");
    textBox1.AppendText($"{sw.Elapsed.TotalSeconds.ToString()} \r\n");
}

以下是執行結果

  花費時間(秒)
 foreach 遍歷 0.0255781
 for 遍歷 0.0122538 

4. 結論

Foreach 效能通常與For 差異不大,但要確保不會影響原資料時,使用Foreach為最佳選擇。

Github 代碼下載