`Control.Dispose()`是否删除所有事件注册? [英] Does `Control.Dispose()` remove all event registrations?

查看:71
本文介绍了`Control.Dispose()`是否删除所有事件注册?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我在 System.Windows.Forms.Control 上调用 Dispose()时,它会自动删除所有事件注册?

When I call Dispose() on a System.Windows.Forms.Control, does it automatically remove all event registrations?

例如,以下内容是否足够:

So for example, is the following sufficient:

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

还是我需要显式注销事件处理程序,例如:

Or do I need to unregister the event handler explicitly, like this:

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


推荐答案

不是,不是。您应该自己删除处理程序。简单测试可以证明这一点。

Nope, It doesn't. You ought to remove the handlers yourself. Simple test can prove that.

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?");
}

运行上面的代码,您会看到MessageBox弹出,说:糟糕!还活着?这意味着即使我们处置 控件,处理程序也不会被删除。

Run the above code, You'll see MessageBox popping up saying "Oops! Still alive?" which means handlers are not removed even when we Dispose the Control.

请参考 Marc在这里的回答看看这如何影响垃圾回收。

Refer Marc's answer here to see how this can affect Garbage collection.

这篇关于`Control.Dispose()`是否删除所有事件注册?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆