首頁 >後端開發 >C++ >為什麼C#循環操作捕獲相同的變量,如何避免這種變量?

為什麼C#循環操作捕獲相同的變量,如何避免這種變量?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-02-03 07:44:16580瀏覽

Why Do C# Loop Actions Capture the Same Variable, and How Can This Be Avoided?

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>

這段代碼的預期輸出是0、2、4、6和8。然而,實際輸出卻是五個10。這是因為所有操作都引用同一個被捕獲的變量variable,該變量在循環中被更新。調用時,所有操作都具有相同的值10。

為了避免這個問題並確保每個操作實例都有其自己的被捕獲變量,需要在循環內復制該變量:

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

通過創建變量的局部副本,每個操作都捕獲其自身唯一的值,從而得到預期的輸出0、2、4、6、8。

這種變量捕獲的概念對於理解C#中閉包的行為至關重要。在循環內定義操作時,務必考慮變量的生命週期及其可訪問性。

以上是為什麼C#循環操作捕獲相同的變量,如何避免這種變量?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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