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