是否`Control.Dispose()`删除所有事件注册?(Does `Control.Dispo

2019-10-21 00:06发布

当我打电话Dispose()System.Windows.Forms.Control ,它会自动删除所有事件注册?

因此,例如,是以下足够了:

var button = new Button();
button.Click += someObject.clickHandler;
// ...
button.Dispose();

或者,我需要明确地注销事件处理程序,如下所示:

var button = new Button();
button.Click += someObject.clickHandler;
// ...
button.Click -= someObject.clickHandler;
button.Dispose();

Answer 1:

不,事实并非如此。 你应该删除自己的处理程序。 简单的测试可以证明这一点。

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);

    var button = new Button();
    button.Click += button_Click;

    //Some code
    button.Dispose();
    button.PerformClick();//Simulate a click event
}

void button_Click(object sender, EventArgs e)
{
    MessageBox.Show("Oops! Still alive?");
}

运行上面的代码,你会看到消息框弹出说:“哎呀!还活着吗?” 这意味着即使我们的处理程序不会被删除 DisposeControl

请参考这里马克的回答 ,看看这会如何影响垃圾收集。



Answer 2:

调用Dispose()没有明确移除事件处理程序,但它确实导致不再发送这些事件。 当垃圾收集器回收从所述存储器button ,偶数记录将被最终去除。

要考虑的更重要的情况是,当button被列出来自其他对象的事件:

var button = new Button();
otherObject.SomeEvent += button.HandleSomeEvent;
// ...
button.Dispose();

在这种情况下,已注册的事件处理程序实际上可以防止button从得到垃圾收集。 如果这种情况适用于你的代码,你需要或者删除在相关事件侦听器Dispose()方法,或者使用弱事件侦听器模式,让垃圾回收器清理这些处理程序。



文章来源: Does `Control.Dispose()` remove all event registrations?