c# - 关于 C# lambda 中值捕获的困惑

标签 c# lambda

为了说明我的困惑,请看下面的例子:

int a = 0;
Action act = () => ++a;
act();
Console.WriteLine(a);

我很难弄清楚在 lambda 中修改捕获的变量可能会如何影响局部变量 a。首先,隐式生成的 lambda 函数对象无法存储对局部变量 a 的引用。否则,如果稍后返回并调用 act,则引用的局部变量 a 将已经消失。这个问题的解决方案是按值复制,通过直接复制 int 值或通过装箱,这样函数对象就会有自己的副本局部变量 a。但这并不能解释刚才给出的例子。那么,底层机制是什么?会不会是看似局部变量a实际上不再是局部变量,而是被编译器翻译成对生成的lambda函数对象中的int字段的引用?

最佳答案

这里的重点是closure .编译后 a 不再是局部变量 - 它是自动生成类的一个字段,无论是在函数范围还是在 lambda 中。

关于c# - 关于 C# lambda 中值捕获的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36567683/

相关文章:

python - 在运行时创建一个 python 函数来匹配可变数量的字典条目

python - 无法将 python 请求库导入 AWS Lambda 函数

vb.net - 从 VB.NET 中的列表中删除特定值

c# - 适当的类似列表的排序数据结构

c# - 带空括号 () 的 Lambda 表达式

c# - LINQ 查询可能无限的列表

c# - Entity Framework 查询中的用户 trimstart

java - LambdaJ:为什么我们不能在 select 子句中应用操作?

c# - 路径中的目录名称

c# - 将每行中具有 int 值的文件转换为 IEnumerable<int>