首頁 >後端開發 >C++ >為什麼C#'s' foreach”循環變量可重用會導致關閉問題?

為什麼C#'s' foreach”循環變量可重用會導致關閉問題?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-31 21:11:11461瀏覽

Why Does C#'s `foreach` Loop Variable Reuse Cause Problems with Closures?

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn