【发布时间】:2015-09-10 06:24:54
【问题描述】:
如果我将 Lambda 挂钩到这样的事件:
static void DoSomething(Control control)
{
control.SomeEvent += StaticMethodThatHandlesEvent;
Control parentControl = control.Parent;
parentControl.Disposed += (sender, args) =>
{
control.SomeEvent -= StaticMethodThatHandlesEvent;
};
}
在什么条件下可以收集到 lambda?如果收集到 parentControl 会被收集吗?是否可以收集 parentControl(假设它已正确处理并且我的代码中没有对它的任何引用)?
编辑:整个代码在一个静态类中。这相关吗?
【问题讨论】:
-
这取决于匿名委托的实现方式。特别是,lambda 的主体中是否有任何闭包?
-
我解决了这个问题,现在它与我所做的非常接近。所以我想我在匿名代表中只有
control。 -
那不是多余的吗?当然,如果父控件被收集,子控件也会被收集,包括事件处理程序委托。你到底想解决什么?只有当事件的存活时间超过其处理程序时,事件处理程序才会真正“泄漏”——
Control几乎不是这种情况。 -
MethodThatHandlesEvent 是一个静态方法。没有对事件处理程序所挂钩的 Object 的引用吗?
标签: c# .net lambda garbage-collection