理解c#lambda表達式捕獲及其解決方案
> 環路中的c#lambda表達式表現出一個常見的陷阱:它們捕獲相同的變量,從而導致意外結果。 之所以發生這種情況,是因為lambda表達式在創建時不會捕獲變量的
<code class="language-csharp">List<Func<int>> actions = new List<Func<int>>(); int variable = 0; while (variable < 5) { actions.Add(() => variable * 2); ++variable; } foreach (var act in actions) { Console.WriteLine(act.Invoke()); }</code>
的值(循環完成後10個),而不是在創建每個lambda時其值。 variable
現在,每個lambda表達式都會捕獲一個獨特的變量,從而產生正確的輸出。
c#5及以後: 在C#5及更高版本中,循環的行為已更改以解決此問題。 編譯器使用“閉合分配臨時變量”(CATV)自動為每次迭代創建一個單獨的變量,從而消除了對手動副本的需求。 這種簡化使代碼更清潔,更可讀。 但是,
循環示例仍然需要明確的副本。<code class="language-csharp">List<Func<int>> actions = new List<Func<int>>(); int variable = 0; while (variable < 5) { int copy = variable; // Create a copy actions.Add(() => copy * 2); ++variable; }</code>
以上是為什麼c#lambda循環中的表達式捕獲相同的變量,如何解決?的詳細內容。更多資訊請關注PHP中文網其他相關文章!