我必须取消订阅所有事件处理程序吗?
问题描述:
从VS中的Designer中,假设你双击一个按钮并生成这个Click事件处理程序。我必须取消订阅所有事件处理程序吗?
订阅代码位于designer.cs中。
我想知道,在处置表单必须取消事件?
此外,窗体中的所有控件都将在表单处理时处理?它实际上是递归地在每个控件上调用dispose?
答
如果您挂钩了自己的事件,则无需在Dispose上解除事件。
如果您将某个事件挂接到另一个对象中,您只需要担心。其原因是事件挂钩使用户保持参考活动。如果你不能解开钩子,那么只要可观察物仍然存在,你就不会收集垃圾。
当你勾起你自己的事件时,你有一个对自己的引用,这是循环的,因此你不需要担心它。
由于这个原因,我开始支持更松散耦合的事件模式。这是.NET中内存泄漏的第一位。我更喜欢Event Aggregator模式(与weak events)。
答
只要事件处理程序代码的形式本身,那么你就不会需要退订的事件 - 因为不会有悬空的事件处理程序的控件形式本身将遭到破坏
答
关于“它实际上是否会递归地处理每个控件?”的问题,答案是肯定的。
一个简单的测试可以通过在控件的Dispose方法中放置一个断点来完成。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.Controls.Add(new SuperButton());
}
}
public class SuperButton : Button
{
protected override void Dispose(bool disposing)
{
//Place breakpoint on the line below
base.Dispose(disposing);
}
}
感谢您的好解释。当你对自己有吸引力时,不要脱钩,这是完美的感觉。 – pdiddy 2009-08-27 15:06:17