首頁 > 後端開發 > C++ > c#'s` foreach循環變量可重複使用會導致Lambdas的意外行為嗎?

c#'s` foreach循環變量可重複使用會導致Lambdas的意外行為嗎?

Barbara Streisand
發布: 2025-01-31 21:26:09
原創
725 人瀏覽過

Does C#'s `foreach` Loop Variable Reuse Cause Unexpected Behavior with Lambdas?

C# foreach循環變量重用:一個歷史遺留問題

在使用Lambda表達式或匿名方法時,C#的foreach循環變量重用可能會導致潛在問題。這種重用會導致“修改後的閉包”問題,其中循環內的所有Lambda表達式都引用變量的最終值,而不是每次迭代期間的當前值。

這種特殊行為的出現是因為循環變量是在循環作用域之外聲明的,如下面的代碼轉換所示:

<code class="language-c#">string s;
while (enumerator.MoveNext())
{
   s = enumerator.Current;
   ...
}</code>
登入後複製

儘管有人聲稱在循環外部聲明變量不會帶來性能優勢,可能只對循環結束後訪問它有用,但這種方法由於閉包問題可能導致嚴重錯誤。

與for循環不同,for循環的變量作用域在循環體內部,foreach循環的變量會被重用,並且不能在循環外部訪問。這種不一致性增加了不必要的錯誤風險,並使調試變得困難。

雖然這種設計選擇可能是在引入Lambda表達式和匿名方法之前做出的,但它並沒有被修改,並且仍然會給開發人員帶來問題。

C# 5中的重大更改

承認了這個設計缺陷,C# 5引入了一個重大更改來解決它。 foreach循環變量現在會在邏輯上作用於循環體內部。這意味著閉包將在每次迭代時捕獲變量的新副本,從而消除修改後的閉包問題。

然而,for循環將保持不變,並且更改不會追溯應用於早期C#版本。因此,開發人員在使用帶有Lambda表達式或匿名方法的foreach循環時,應繼續謹慎操作。

以上是c#'s` foreach循環變量可重複使用會導致Lambdas的意外行為嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板