我有一个关于匿名事件处理程序的简短问题:
这是我的代码:
public void AddTestControl(Control ctrl)
{
ctrl.Disposed += (o, e) => { RemoveTestControl(ctrl); };
ctrl.SomeEvent += _Control_SomeEvent;
}
public void RemoveTestControl(Control ctrl)
{
ctrl.SomeEvent -= _Control_SomeEvent;
}
上面的代码是否正常,或者是否应该重写代码以删除 Disposed 事件处理程序? 像这样:
public void AddTestControl(Control ctrl)
{
ctrl.Disposed += _Control_Disposed;
ctrl.SomeEvent += _Control_SomeEvent;
}
public void RemoveTestControl(Control ctrl)
{
ctrl.Disposed -= _Control_Disposed;
ctrl.SomeEvent -= _Control_SomeEvent;
}
最佳答案
通常,您需要从对象中删除事件处理程序以使其符合垃圾回收条件的唯一情况是发布者对象(定义事件的对象)生命周期更长比 subscriber 对象(包含事件处理程序的对象)。在这种情况下,GC 将无法在订阅者超出范围时释放订阅者,因为它仍被发布者引用。
在这种情况下,假设这是 WebForms 或 WinForms,发布者(即 Control
对象)很可能是订阅者的子对象(可能是Page
或 Form
),这将是第一个超出范围的对象,并带走所有关联的对象。因此,无需删除事件处理程序。
关于c# - 匿名事件处理程序和处置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9531211/