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