”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 为什么lambda表达式捕获迭代变量的最终值,如何避免这种情况?

为什么lambda表达式捕获迭代变量的最终值,如何避免这种情况?

发布于2025-02-06
浏览:978

Why Do Lambda Expressions Capture the Final Value of Iteration Variables, and How Can This Be Avoided?

在Lambda表达式中使用迭代变量的风险

Lambda表达式提供了一种在循环中定义内联函数的简洁方法。但是,直接在lambda中使用迭代变量可能会导致以后出现意外行为。

迭代变量的Lambda陷阱:

考虑以下代码:

for (int i = 0; i  Console.WriteLine(i);
    actions.Add(action);
}

foreach (var action in actions) {
    action();
}

人们可能会认为每个lambda都会打印i的相应值。但是,由于闭包,所有lambda都共享对i的相同捕获引用。

意外的打印结果:

当循环退出时,i变为10,所有lambda现在都指向此最终值。结果,执行lambda将打印十次“10”,而不是预期的从0到9的序列。

这种行为源于lambda闭包维护对其作用域内声明的变量的引用,即使循环已完成也是如此。

避免方法和替代方法:

为了解决这个问题,在循环中创建一个局部变量,并为其赋值迭代变量的值:

for (int i = 0; i  Console.WriteLine(j);
    actions.Add(action);
}

foreach (var action in actions) {
    action();
}

这确保每个lambda捕获j的不同值,从而产生预期的打印序列。

请记住,直接在lambda表达式中使用迭代变量可能会导致与闭包相关的意外情况。相反,考虑创建局部变量以准确捕获所需的值。

最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3