c# - 匿名事件处理程序和处置

标签 c# disposing

我有一个关于匿名事件处理程序的简短问题:

这是我的代码:

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 对象)很可能是订阅者的子对象(可能是PageForm),这将是第一个超出范围的对象,并带走所有关联的对象。因此,无需删除事件处理程序

关于c# - 匿名事件处理程序和处置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9531211/

相关文章:

c# - 配置连接、命令、适配器

c# - Directory.Exists() 总是返回 false?

c# - 多维数组符号之间的区别(object[][] 和 object[,])

c# - C# 中的字节数组到字符串

c# - 做继承权

c# - 窗口显示红色 x,但我找不到错误通知

在 Swing 中处理 JFXPanel 时出现 JavaFX IllegalStateException