当我打电话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();
不,事实并非如此。 你应该删除自己的处理程序。 简单的测试可以证明这一点。
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?");
}
运行上面的代码,你会看到消息框弹出说:“哎呀!还活着吗?” 这意味着即使我们的处理程序不会被删除 Dispose
的Control
。
请参考这里马克的回答 ,看看这会如何影响垃圾收集。
调用Dispose()
没有明确移除事件处理程序,但它确实导致不再发送这些事件。 当垃圾收集器回收从所述存储器button
,偶数记录将被最终去除。
要考虑的更重要的情况是,当button
被列出来自其他对象的事件:
var button = new Button();
otherObject.SomeEvent += button.HandleSomeEvent;
// ...
button.Dispose();
在这种情况下,已注册的事件处理程序实际上可以防止button
从得到垃圾收集。 如果这种情况适用于你的代码,你需要或者删除在相关事件侦听器Dispose()
方法,或者使用弱事件侦听器模式,让垃圾回收器清理这些处理程序。