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

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

Susan Sarandon
發布: 2025-02-03 07:59:09
原創
908 人瀏覽過

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

C#循環中的捕獲變量:一個奇怪的難題

在使用C#循環時,你可能會遇到捕獲變量的一個特殊問題。讓我們考慮以下場景:

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();
}
登入後複製

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

問題:循環中的捕獲變量

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

解決方案:副本救援

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

while (variable < 5)
{
    int copy = variable;
    actions.Add(() => Console.WriteLine(copy * 2));
    ++variable;
}
登入後複製

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

注意事項

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

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

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