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

时间:2018-04-29 01:06:44

标签: c# .net memory lambda

提到的嵌套函数意味着它既可以是lambda函数,也可以是局部函数。

我很好奇捕获的变量的分配位置。

例如:

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

本地变量x由返回的lambda函数捕获。

然后在内存中分配了这个x?它是在堆栈还是堆内存上?

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

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

首先在堆栈中分配并在Test返回时转移到堆中吗? (我想不是因为这听起来不必要地耗费了一些资源,但是如果在x返回后可以访问此Test它是如何工作的?)

1 个答案:

答案 0 :(得分:1)

Stack vs heap在这里并不是一个非常有用的区别,但我可以让你知道会发生什么。编译器在幕后重写此代码。它为项目添加了一个类,该类具有整数值作为成员。然后,这个函数和lambda函数都会获得对这个新类的同一个实例的引用。

至少,这是我上次读到它时的处理方式,这在前一段时间已经存在......但我怀疑它的变化很大。欢迎使用编程,您认为自己知道的所有内容都是过去某个时间内事物的快照。