gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:15:19 25 4
gpt4 key购买 nike

这里提到的嵌套函数是指既可以是lambda函数又可以是局部函数。

我很好奇捕获的变量分配在哪里。

例如:

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

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

那么这个x分配在内存的什么地方呢?是在栈内存还是堆内存?

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

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

它是否首先在堆栈中分配并在 Test 返回时立即转移到堆中? (我猜不是因为这听起来像是不必要地消耗了一些资源,而是在 Test 返回后如何让它可以访问这个 x?)

最佳答案

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

至少,这就是我上次读到它时的处理方式,这已经是很久以前的事了……但我怀疑它是否发生了很大变化。欢迎来到编程,在这里,您认为自己知道的一切实际上都是过去某个时间的快照。

关于c# - 在 C# 的嵌套函数中分配的捕获变量在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50082471/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com