首頁 >後端開發 >C++ >為什麼具有捕獲變量的C#循環會產生意外的結果?

為什麼具有捕獲變量的C#循環會產生意外的結果?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-02-03 08:20:10211瀏覽

Why Do C# Loops with Captured Variables Produce Unexpected Results?

深入探討 C# 循環中捕獲變量的問題

在 C# 中,開發人員在循環迭代中使用捕獲變量時會遇到一個有趣的問題。考慮以下代碼片段:

<code class="language-csharp">List<Action> actions = new List<Action>();

int variable = 0;
while (variable < 5)
{
    actions.Add(() => Console.WriteLine(variable * 2));
    ++variable;
}

foreach (var act in actions)
{
    Console.WriteLine(act.Invoke());
}</code>

儘管預期輸出為 0、2、4、6 和 8,但代碼卻意外地輸出了五個 10。造成這種行為的原因在於捕獲的變量 variable。所有操作都引用 variable 的同一實例,當變量在循環中發生變化時,這可能會導致不可預測的結果。

解決捕獲變量問題

為了克服此限制並允許每個操作擁有其自己的捕獲變量,C# 提供了一個簡單的解決方案:

<code class="language-csharp">while (variable < 5)
{
    int copy = variable;
    actions.Add(() => Console.WriteLine(copy * 2));
    ++variable;
}</code>

通過在循環內創建 variable 的副本,每個操作都捕獲其自身的唯一實例,從而確保 variable 在 lambda 表達式外部的變化不會影響捕獲的值。

其他常見情況

此問題也可能出現在涉及循環中變量的其他場景中,例如 forforeach 迭代:

<code class="language-csharp">// For loop
for (int i = 0; i < 5; i++)
{
    // ... similar issue ...
}

// Foreach loop
// ... similar issue ...</code>

在這兩種情況下,都需要變量的局部副本才能捕獲當前循環迭代。

結論

理解 C# 循環中捕獲變量的行為對於避免意外結果至關重要。本文中討論的解決方法確保每個操作都有其自己的獨立捕獲變量,從而實現可預測和預期的行為。

以上是為什麼具有捕獲變量的C#循環會產生意外的結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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