class A
{
public event EventHandler AEvent;
}
class B
{
private A _foo;
private int _bar;
public void AttachToAEvent()
{
_foo.AEvent += delegate()
{
...
UseBar(_bar);
...
}
}
}
Since delegate
捕获变量this._bar
,它是否隐含地保留了实例B
?将实例B
通过事件处理程序引用并通过实例捕获变量A
?
如果是的话,情况会有所不同吗_bar
是一个局部变量AttachToAEvent
method?
因为在我的例子中A
比一个实例寿命长得多且小得多B
,我担心这样做会导致“内存泄漏”。
阿尼的回答是正确的。总结并添加一些细节:
由于委托捕获了变量 this._bar,它是否隐式保存 B 的实例?
是的。 “这个”被捕获。
B 的实例是否会通过事件处理程序引用并由 A 的实例捕获变量?
Yes.
如果 _bar 是 AttachToAEvent 方法的局部变量,会有不同吗?
是的。在这种情况下,闭包对象将保留本地对象;本地将被实现为封闭的领域。
由于在我的例子中,A 的实例比 B 的实例寿命长得多且小得多,因此我担心这样做会导致“内存泄漏”。
你的担心是完全正确的。你的情况已经很糟糕了,但实际上情况还可以更糟糕当你有two正在发挥作用的匿名函数。现在,同一局部变量声明空间中的所有匿名函数共享一个公共闭包,这意味着all封闭的外部变量(包括“this”)被扩展到最长寿他们所有人。有关详细信息,请参阅我关于该主题的文章:
http://blogs.msdn.com/b/ericlippert/archive/2007/06/06/fyi-c-and-vb-closures-are-per-scope.aspx http://blogs.msdn.com/b/ericlippert/archive/2007/06/06/fyi-c-and-vb-closures-are-per-scope.aspx
我们希望在假设的 C# 未来版本中修复此问题;我们可以更好地对闭包进行分区,而不是创建一个大的闭包。然而,这不会很快发生。
此外,C# 5 的“异步/等待”功能也可能会加剧当地人的寿命比您预期的要长的情况。我们没有人对此感到兴奋,但正如他们所说,完美是令人敬畏的敌人。我们对如何调整异步块的代码生成以改善这种情况有一些想法,但没有承诺。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)