在c#中分配的嵌套函数中分配的捕获变量在哪里



提到的嵌套函数意味着它可以是lambda函数和本地函数。

我对捕获的变量分配的位置感到好奇。

例如:

private Func<int> Test(int arg)
{
    var x = arg;
    return () => x;
}

局部变量x由返回的lambda函数捕获。

那么,此x在存储器中分配在哪里?是在堆栈还是堆内存?

如果此x在堆栈上,则Test上的任何进一步调用都可以更改x的值,并且返回的lambda函数的行为可能会错误地修改。

但是,如果它在堆内存上动态分配的,它将不再像局部变量了。

它首先是在堆栈中分配的,并在Test返回时转移到堆?(我想这不是因为听起来不必要地花费了一些资源,但是如何使其可用于访问x之后访问此CC_7?(

堆栈与堆并不是一个非常有用的区别,但是我可以让您了解发生的事情。编译器重写此代码在幕后。它为该项目添加了一个具有成员整数值的项目。然后,此函数和lambda函数都会引用该新类的同一实例。

至少,这就是我上次阅读它的处理方式,这是在肯定的一段时间之前……但是我怀疑它发生了很大变化。欢迎来到编程,您认为您所知道的一切确实是过去某个时候情况的快照。

最新更新