首页 >后端开发 >C++ >为什么 Lambda 表达式捕获迭代变量的最终值?

为什么 Lambda 表达式捕获迭代变量的最终值?

Barbara Streisand
Barbara Streisand原创
2025-01-14 12:26:43397浏览

Why Do Lambda Expressions Capture the Final Value of Iteration Variables?

Lambda表达式中使用迭代变量的潜在陷阱

在编程领域,Lambda表达式提供了一种简洁的方式来表示匿名函数。然而,在Lambda表达式中使用迭代变量可能会导致意想不到的结果。

考虑以下代码:

<code class="language-c#">List<Action> actions = new List<Action>();
for (int i = 0; i < 10; i++)
{
    actions.Add(() => Console.WriteLine(i));
}

foreach (Action action in actions)
{
    action();
}</code>

这段代码无意中将所有Lambda表达式与同一个迭代变量i关联起来。因此,当每个Lambda表达式执行时,它引用的是i的最终值,而不是Lambda创建时i的预期值。

结果,输出可能与预期不符。代码并非像预期的那样打印0到9,而是打印十次10。值得注意的是,这种行为源于所有涉及的委托都捕获了单个变量。

为了避免这种意想不到的结果,建议在循环内创建一个局部变量,并将迭代变量的值赋给它。这样,每个Lambda表达式都引用一个不同的局部变量,确保它保留预期的值。 修改后的代码如下:

<code class="language-c#">List<Action> actions = new List<Action>();
for (int i = 0; i < 10; i++)
{
    int temp = i; // 创建局部变量
    actions.Add(() => Console.WriteLine(temp));
}

foreach (Action action in actions)
{
    action();
}</code>

通过这种方式,每个Lambda表达式都会捕获一个独立的temp变量,从而避免了变量值被覆盖的问题,最终输出将正确地显示0到9。

以上是为什么 Lambda 表达式捕获迭代变量的最终值?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn