首頁 >後端開發 >C++ >為什麼c#lambda循環中的表達式捕獲最終變量值,以及如何修復?

為什麼c#lambda循環中的表達式捕獲最終變量值,以及如何修復?

Barbara Streisand
Barbara Streisand原創
2025-02-03 08:10:09799瀏覽

Why Do C# Lambda Expressions in Loops Capture the Final Variable Value, and How Can This Be Fixed?

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn