讀【157個完美化C#的建議】一書的理解筆記 - 017
重點:何時用Foreach ? 要確保不會影響原資料時,可以使用Foreach確保資料使用的安全性
如果要異動原始參考資料,仍需使用For
流程說明 |
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為最佳選擇。