C# 5.0:為什麼 for
循環錯過了捕獲的閉包增強
C# 5.0 解決了 foreach
循環中捕捉循環變數的問題,確保閉包變數準確反映捕獲時循環變數的值。 但是,此改進並未應用於 for
循環,它保留了 5.0 之前的行為。
遺漏原因
這種有意的排除源自於 for
和 foreach
循環之間的根本差異:
for
循環:以初始化為中心。 for
迴圈以初始化程序開始,為循環變數分配一個值。此變數是循環邏輯的核心,需要反覆修改和檢查。 foreach
循環:基於迭代器。 foreach
循環依賴於為每次迭代提供值的迭代器。循環變數充當佔位符,存取迭代器的值。 在 for
迴圈中,單一「循環變數實例化」的概念與其註重初始化的性質相符。 有一個邏輯上一致的循環變數實例,已初始化、更新並控制循環終止。
考慮這個for
循環:
<code class="language-csharp">for (int i = 0; i < 10; i++) { ... }</code>
這裡,i
管理迭代計數。它初始化為 0,每次迭代遞增,並控制循環終止。 捕獲 i
的閉包將直觀地引用單一值,而不管 i
的循環內更改如何。這與 for
迴圈對變數變化狀態的依賴相矛盾。
相反,foreach
循環不依賴循環變數的狀態。它們迭代集合而不需要特定的變數實例。 因此,閉包在捕獲時捕獲迭代器的值,與後續修改隔離。
以上是為什麼 C# 5.0 捕獲的閉包改進沒有應用於'for”循環?的詳細內容。更多資訊請關注PHP中文網其他相關文章!