首頁 > 後端開發 > C++ > 為什麼c#lambda循環中的表達式捕獲相同的變量,如何解決?

為什麼c#lambda循環中的表達式捕獲相同的變量,如何解決?

Barbara Streisand
發布: 2025-02-03 07:46:13
原創
294 人瀏覽過

Why Do C# Lambda Expressions in Loops Capture the Same Variable, and How Can This Be Resolved?

理解c#lambda表達式捕獲及其解決方案

> 環路中的

c#lambda表達式表現出一個常見的陷阱:它們捕獲相同的變量,從而導致意外結果。 之所以發生這種情況,是因為lambda表達式在創建時不會捕獲變量的 value ,而是捕獲變量本身的參考。 考慮此示例: 代碼輸出五個8s,而不是預期輸出(0、2、4、6、8),而不是預期輸出(0、2、4、6、8)。這是因為所有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中文網其他相關文章!

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