【发布时间】:2018-10-09 11:36:50
【问题描述】:
提到的嵌套函数意味着它既可以是 lambda 函数,也可以是本地函数。
我很好奇捕获的变量分配在哪里。
例如:
private Func<int> Test(int arg)
{
var x = arg;
return () => x;
}
局部变量x被返回的lambda函数捕获。
那么这个x在内存中分配在哪里呢?是在栈内存还是堆内存上?
如果此 x 在堆栈上,则对 Test 的任何进一步调用都可能更改 x 的值,并且返回的 lambda 函数的行为可能会被错误地修改。
但是如果它是在堆内存上动态分配的,它就不再像一个局部变量了。
它是否首先在堆栈中分配并在Test 返回时转移到堆中? (我猜不是因为这听起来像是不必要地消耗了一些资源,而是在Test 返回后使它可以访问这个x 是如何工作的?)
【问题讨论】:
-
语义上,无论分配细节如何,每次调用
Test都会有一个不同的(或“新鲜”)变量x。因此,没有两个函数/闭包返回(来自不同的调用)可以访问相同的x变量或直接交互。 -
Func<T>是代表。不确定是否与您的问题有关:stackoverflow.com/questions/20357737/… -
每个人都知道它的行为方式,但这并不完全是问题,即如何分配捕获的局部变量以及如何分配捕获的局部变量以使其行为如此。 @user2864740
-
很明显
x不能在堆栈上分配,因为它的生命周期超出了创建它的方法的范围。 -
它没有指定如何捕获局部变量,所以它与我的问题有关。 @ChristianGollhardt