gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:49:33 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com