理解c#lambda表達式變量捕獲
>在C#編程中的常見問題涉及循環中的lambda表達式。 Lambda表達式捕獲變量的方式會導致意外結果。 讓我們探索這個問題及其解決方案。
考慮此代碼:
<code class="language-csharp">List<Func<int>> actions = new List<Func<int>>(); int variable = 0; while (variable < 10) { actions.Add(() => variable * 2); ++variable; } foreach (var act in actions) { Console.WriteLine(act.Invoke()); }</code>
>預期輸出是偶數數字的序列(0、2、4、6、8)。 但是,實際輸出為五個10。 之所以發生這種情況,是因為每個lambda表達式捕獲參考>,而不是其創建時的值。 到調用lambdas時,variable
>已經達到其最終值為10。 variable
>
為了糾正這一點,我們需要在每個lambda表達式的範圍內創建一個循環變量的副本:
現在,每個lambda表達式在創建時捕獲了其自己的
>值的獨立副本,產生了預期的輸出。<code class="language-csharp">List<Func<int>> actions = new List<Func<int>>(); int variable = 0; while (variable < 10) { int copy = variable; // Create a copy of the variable actions.Add(() => copy * 2); ++variable; } foreach (var act in actions) { Console.WriteLine(act.Invoke()); }</code>
c#5和foreach loopsvariable
>重要的是要注意,這種行為對C#5和更高版本中的循環的關注不大。編譯器在中以不同的方式處理變量捕獲,以防止此問題。 但是,顯式複制方法仍然是與舊C#版本的清晰度和兼容性的最佳實踐。 使用這種方法可確保所有C#版本和循環類型的一致行為。
>以上是為什麼c#lambda循環中的表達式捕獲最終變量值,以及如何修復?的詳細內容。更多資訊請關注PHP中文網其他相關文章!