我觉得我对闭包、如何使用它们以及它们何时有用有相当不错的理解。但我不明白的是它们实际上是如何在内存中幕后工作的。一些示例代码:
public Action Counter()
{
int count = 0;
Action counter = () =>
{
count++;
};
return counter;
}
通常,如果闭包未捕获 {count},则其生命周期将限定在 Counter() 方法内,并且在完成后,它将与 Counter() 的堆栈分配的其余部分一起消失。当它关闭时会发生什么?这次 Counter() 调用的整个堆栈分配是否保留?它是否将 {count} 复制到堆中?它是否实际上从未在堆栈上分配,但被编译器识别为已关闭,因此始终存在于堆上?
对于这个特定问题,我主要感兴趣的是它在 C# 中的工作原理,但不反对与支持闭包的其他语言进行比较。
你的第三个猜测是正确的。编译器会生成如下代码:
private class Locals
{
public int count;
public void Anonymous()
{
this.count++;
}
}
public Action Counter()
{
Locals locals = new Locals();
locals.count = 0;
Action counter = new Action(locals.Anonymous);
return counter;
}
合理?
另外,您还要求进行比较。 VB 和 JScript 都以几乎相同的方式创建闭包。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)