c#foreach
循環變量重複使用:問題和解決方案
> c#lambda表達式和匿名方法在foreach
>循環中引入了“修改後的閉合”問題。 考慮此示例:
<code class="language-csharp">foreach (var s in strings) { query = query.Where(i => i.Prop == s); // Modified closure issue ... }</code>
編譯器的生成代碼揭示了問題的根源:
><code class="language-csharp">string s; while (enumerator.MoveNext()) { s = enumerator.Current; ... }</code>
s
變量被聲明外部
>為什麼?
>
for
這個變量重複使用是早期C#(1.0)中的設計選擇。 內部變量和外部變量之間的差異被認為微不足道。但是,C#2.0的封閉語義改變了這一點。 與
在C#5和更高版本中的更改 >識別缺陷,C#5引入了一個破壞的變化:
循環變量現在是邏輯上的>內部的foreach
>。 每次迭代都會收到一個新副本。
這解決了“修改後的閉合”問題,使較舊的方法不安全。 它還突出了仔細的
以上是C#foreach循環變量重複使用會導致'訪問修改後的關閉”問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!