【发布时间】:2010-12-28 01:40:51
【问题描述】:
我觉得我对闭包、如何使用它们以及它们何时有用的理解相当不错。但我不明白的是它们在内存中的幕后实际工作方式。一些示例代码:
public Action Counter()
{
int count = 0;
Action counter = () =>
{
count++;
};
return counter;
}
通常,如果 {count} 没有被闭包捕获,它的生命周期将被限定为 Counter() 方法,并且在它完成后,它将与 Counter() 的其余堆栈分配一起消失。但是当它关闭时会发生什么?这个 Counter() 调用的整个堆栈分配是否仍然存在?它是否将 {count} 复制到堆中?它是否实际上从未在堆栈上分配,但被编译器识别为已关闭并因此始终存在于堆上?
对于这个特定的问题,我主要感兴趣的是它在 C# 中的工作原理,但不反对与支持闭包的其他语言进行比较。
【问题讨论】:
-
好问题。我不确定,但是是的,您可以在 C# 中保留堆栈框架。生成器一直使用它(用于数据结构的 LINQ),它依赖于引擎盖下的产量。希望我没有偏离标准。如果我是,我会学到很多东西。
-
yield 将该方法转换为具有状态机的单独类。堆栈本身没有保留,但堆栈状态在编译器生成的类中移动到类状态
-
@thecoop,你有解释这个的链接吗?
-
当然,如果您想了解如何构建迭代器,请阅读本系列:blogs.msdn.com/oldnewthing/archive/2008/08/12/8849519.aspx
-
您绝对不能“保留堆栈框架”。堆栈帧在堆栈上!如果我们让堆栈保持活动状态,我们将如何弹出堆栈?