提到的嵌套函数意味着它既可以是lambda函数,也可以是局部函数。
我很好奇捕获的变量的分配位置。
例如:
private Func<int> Test(int arg)
{
var x = arg;
return () => x;
}
本地变量x
由返回的lambda函数捕获。
然后在内存中分配了这个x
?它是在堆栈还是堆内存上?
如果此x
处于堆栈状态,则Test
上的任何进一步调用都可能会更改x
的值,并且可能会错误地修改返回的lambda函数的行为。
但如果 在堆内存上动态分配,它就不再像局部变量了。
首先在堆栈中分配并在Test
返回时转移到堆中吗? (我想不是因为这听起来不必要地耗费了一些资源,但是如果在x
返回后可以访问此Test
它是如何工作的?)
答案 0 :(得分:1)
Stack vs heap在这里并不是一个非常有用的区别,但我可以让你知道会发生什么。编译器在幕后重写此代码。它为项目添加了一个类,该类具有整数值作为成员。然后,这个函数和lambda函数都会获得对这个新类的同一个实例的引用。
至少,这是我上次读到它时的处理方式,这在前一段时间已经存在......但我怀疑它的变化很大。欢迎使用编程,您认为自己知道的所有内容都是过去某个时间内事物的快照。