首页 >后端开发 >C++ >为什么具有捕获变量的C#循环会产生意外的结果?

为什么具有捕获变量的C#循环会产生意外的结果?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-02-03 08:20:10248浏览

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