LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

C# 中 foreach 循環和 for 循環深度比較

admin
2024年12月11日 20:31 本文熱度 368

前言

嘿,小伙伴們!

今天,咱們就來聊聊這兩位循環界的 "老炮兒" —— foreach 循環和和 for 循環,看看它們到底有何不同!

foreach 循環的內部實現原理

foreach 循環是 C# 提供的用于簡化集合遍歷的語法,可以說是 C# 為了方便我們這些懶人而發明的,它讓咱們不用去操心那些煩人的細節,直接就可以愉快地遍歷集合。

它的內部實現依賴于集合對象是否實現了 IEnumerable 或 IEnumerator 接口。

IEnumerable 接口:這個接口就像是個神奇的門把手,輕輕一擰就能打開遍歷的大門,里面定義了一個名為 GetEnumerator 的方法,這個方法會返回一個實現了 IEnumerator 接口的對象。

IEnumerator 接口:這個接口有幾個重要的成員:

  • MoveNext 方法,用于判斷是否還有下一個元素,就像按電梯按鈕一樣,按一下就能到下一層
  • Current 屬性,獲取當前元素的值
  • Reset 方法,將迭代器重置到初始位置,實際中很少使用,就像我家里的那臺老式收音機,雖然還在,但已經很久沒用過了

foreach 循環的基本語法就像這樣:

foreach (var item in collection)
{
    // 訪問 item
}

當使用 foreach 循環時,編譯器會生成類似于以下的代碼:

IEnumerator<T> enumerator = collection.GetEnumerator();
try 
{
    while (enumerator.MoveNext()) 
 {
        T item = enumerator.Current;
        // 處理 item
    }
}
finally 
{
    IDisposable disposable = enumerator as IDisposable;
    if (disposable != null
 {
        disposable.Dispose();
    }
}

說明:以上這段代碼的關鍵是 GetEnumerator() 方法返回了一個 IEnumerator 實例,這個實例負責跟蹤當前的元素并能夠移動到下一個元素。

所以 foreach 循環的內部實現可以簡單總結如下

  1. foreach 循環使用迭代器(iterator)來遍歷集合,編譯器會悄悄生成一個狀態機來管理整個過程。
  2. 通過調用 GetEnumerator() 得到的 IEnumerator 對象就像是一個守護者,跟蹤當前元素并帶你到下一個元素。
  3. MoveNext() 是你前進的鑰匙,用于移動到下一個元素,而 Current 用于訪問當前元素,告訴你當前看到的是啥。
  4. foreach 循環在處理任何實現了 IEnumerable 接口的集合時,輕松自如。
  5. foreach 循環自動將代碼置入 try-finally 塊
  6. 若類型實現了 IDisposable 接口,foreach 循環會在循環結束后自動調用 Dispose 方法釋放

for 循環的內部實現原理

for 循環是一種傳統的循環結構,使用上更為靈活,因為它允許你手動控制循環的開始、結束條件和迭代步長

它的內部實現直接依賴于索引訪問或直接迭代,通過索引器來訪問每個元素。

for 循環的基本語法如下:

for (int i = 0; i < array.Length; i++)
{
    // 訪問 array[i]
}

說明:以上這段代碼里的 i 是由程序員控制的索引變量,用于訪問數組或集合中的元素。

所以對于 for 循環的內部實現,我們可以簡單概括如下

  1. for 循環在編譯時會被轉換為一個簡單的計數器循環,直接通過索引訪問數組或集合的元素
  2. 對于數組來說,編譯器能夠直接計算出元素的地址,因此訪問速度非常快
  3. 在處理 List 或其他集合時,for 循環依然能順暢使用索引,但要小心邊界檢查

兩者區別

經過以上的探索,現在咱們來看看這兩哥們兒的區別:

  1. 語法

    • foreach 循環自動管理迭代,你只要負責享受就好。
    • for 循環需要你自己管理索引,要小心別越界!
  2. 可讀性

    • foreach 循環語法優雅簡潔,像是一首流暢的詩,讀起來讓人心情愉悅。
    • for 循環的可讀性稍遜一籌,尤其是在多維數組里,就像是迷宮一樣。
  3. 性能

    • foreach 循環對于實現了 IEnumerable 的集合可能會稍微慢一點。
    • for 循環對于大數組的性能更好些。
  4. 類型安全

    • foreach 循環在編譯時會檢查元素類型,就像是個嚴格的門衛。
    • for 循環可能會導致運行時類型轉換錯誤,就像是一本懸疑小說,有時驚險莫測。
  5. 增刪集合

    • foreach 不允許你在循環中對集合元素進行增刪操作,因為迭代器內部維護了一個對集合版本的控制,任何對集合的增刪操作都會使用版本號加1,容易引發異常。
    • for 可以在循環中對集合進行增刪操作,因為它直接使用索引器,它不對集合版本號進行判斷,所以不存在因為集合的變動而帶來的異常(當然,超出索引長度這種情況除外)。

使用場景

  1. foreach 循環的使用場景

    • 程序只需要遍歷集合中的每個元素,而不需要增刪集合的元素時
    • 集合實現了 IEnumerable 接口(如 List、Array、Dictionary 等)
    • 你希望代碼更加簡潔和易于理解
  2. for 循環的使用場景

    • 程序需要通過索引訪問元素,比如在多維數組中
    • 程序需要在循環中增加或刪除集合的元素
    • 程序需要在遍歷過程中控制循環的步長,比如跳過某些元素

最終建議

  1. 如果你只需要遍歷集合,并且無需增刪集合元素,多數情況下 foreach 循環是首選
  2. foreach 循環不能取代 for 循環,當你需要訪問索引或者需要在循環中增刪集合元素時,使用 for 循環
  3. 對于程序健壯性要求比較高的程序,盡量使用 foreach 循環,因為它是類型安全的,并且若類型實現了 IDisposable 接口,它會在循環結束后自動調用 Dispose 方法釋放資源
  4. 對于性能敏感的應用程序,比如處理 10 萬條數據以上的大數組,可以考慮使用 for 循環
  5. 在編寫代碼時,盡量保持代碼的可讀性和簡潔性,這樣可以減少出錯的機會

該文章在 2024/12/13 9:29:31 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
亚洲一级理论软件 | 五十路一区二区三区视频 | 亚洲区一区二区三区四 | 色综合久久综合一区二区三区 | 亚洲日本va午夜在线电影 | 亚洲国产精品久久久久婷婷图片 |