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中文网其他相关文章!