首頁 >後端開發 >C++ >為什麼我的c#循環捕獲錯誤的變量值?

為什麼我的c#循環捕獲錯誤的變量值?

Susan Sarandon
Susan Sarandon原創
2025-02-03 07:59:09843瀏覽

Why Does My C# Loop Capture the Wrong Variable Value?

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)
{
    act.Invoke();
}</code>

與預期相反,這段代碼打印五個“10”,而不是預期的序列0、2、4、6、8。

問題:循環中的捕獲變量

問題出現在循環內創建的所有lambda函數都捕獲同一個變量variable。因此,當這些函數在循環外部調用時,它們都引用variable的最終值。

解決方案:副本救援

為了解決這個問題,你需要在循環內創建變量的副本,然後在每個lambda函數中捕獲它:

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

通過創建副本,循環內創建的每個閉包都將捕獲它自己variable的唯一值,從而產生預期的輸出。

注意事項

請注意,此技術也適用於for和foreach循環,其中在多個迭代中引用單個變量。為了避免這個問題,建議遵守C# 5編譯器對foreach循環的處理方式,這確保每次迭代都有其自己的捕獲變量。

以上是為什麼我的c#循環捕獲錯誤的變量值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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