首页 > 后端开发 > C++ > 为什么我的 Lambda 表达式捕获循环变量的最后一个值?

为什么我的 Lambda 表达式捕获循环变量的最后一个值?

Patricia Arquette
发布: 2024-10-28 22:50:02
原创
734 人浏览过

Why Does My Lambda Expression Capture the Last Value of a Loop Variable?

在循环迭代中捕获 Lambda 表达式中的变量

该代码片段演示了在 lambda 表达式中使用 foreach 循环的迭代器变量时出现的意外行为。执行时,它不会打印“Hi String”、“Hi Single”和“Hi Int32”,而是为所有三种方法打印“Hi Int32”。

说明

此行为源于lambda 表达式及其捕获变量的性质。当在循环内定义 lambda 表达式时,它捕获循环变量的引用,而不是其值。因此,它在整个循环迭代中引用同一个变量。

在提供的代码中,变量类型由 lambda 表达式捕获。但是,该代码没有考虑到循环的所有迭代之间将共享对类型的相同引用这一事实。因此,每个 lambda 表达式最终都会捕获上次迭代中的 type 值,从而导致意外的打印输出。

更正

要解决此问题并实现预期目标,您需要确保每个 lambda 表达式捕获一个唯一的类型值。为此,请为每次迭代创建一个新变量,为其分配类型的当前值:

foreach (var type in types)
{
   var newType = type;
   var sayHello = 
            new PrintHelloType(greeting => SayGreetingToType(newType, greeting));
   helloMethods.Add(sayHello);
}
登录后复制

通过使用 newType,您可以有效地创建类型的副本,从当前迭代捕获其值。这可确保每个 lambda 表达式对其自身类型值都有唯一的引用,从而产生正确的输出。

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板