C# foreach
循環變量重用:一個不必要的陷阱
在C#中使用lambda表達式或匿名方法時,可能會出現修改後的閉包訪問陷阱。 foreach
循環中變量的重用加劇了這個問題。
編譯器通常在循環體外部聲明循環變量,如修改後的閉包示例所示:
<code class="language-C#">string s; while (enumerator.MoveNext()) { s = enumerator.Current; ... }</code>
這與在循環內聲明變量的預期不同:
<code class="language-C#">while (enumerator.MoveNext()) { string s; s = enumerator.Current; ... }</code>
外部變量聲明加劇了修改後的閉包訪問問題,因為它為變量創建了更長的作用域。在foreach
循環內聲明的變量無法在循環外部訪問。
編譯器決定重用循環變量是在引入lambda表達式和匿名方法之前做出的。因此,當時並沒有充分考慮變量重用的潛在陷阱。
在C# 5中,這個設計缺陷將通過一個重大更改來解決。循環變量將在邏輯上放置在循環體內部,確保每次閉包都獲得一個新的副本。此更改消除了foreach
循環的修改後的閉包訪問陷阱。
雖然此修復是一個受歡迎的改進,但在使用舊版代碼或不支持此修復的舊版C#版本時,仍然需要注意此問題。
以上是為什麼C#'s' foreach”循環變量可重用會導致關閉問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!