我必须取消订阅所有事件处理程序吗?

我必须取消订阅所有事件处理程序吗?

问题描述:

从VS中的Designer中,假设你双击一个按钮并生成这个Click事件处理程序。我必须取消订阅所有事件处理程序吗?

订阅代码位于designer.cs中。

我想知道,在处置表单必须取消事件?

此外,窗体中的所有控件都将在表单处理时处理?它实际上是递归地在每个控件上调用dispose?

如果您挂钩了自己的事件,则无需在Dispose上解除事件。

如果您将某个事件挂接到另一个对象中,您只需要担心。其原因是事件挂钩使用户保持参考活动。如果你不能解开钩子,那么只要可观察物仍然存在,你就不会收集垃圾。

当你勾起你自己的事件时,你有一个对自己的引用,这是循环的,因此你不需要担心它。

由于这个原因,我开始支持更松散耦合的事件模式。这是.NET中内存泄漏的第一位。我更喜欢Event Aggregator模式(与weak events)。

+0

感谢您的好解释。当你对自己有吸引力时,不要脱钩,这是完美的感觉。 – pdiddy 2009-08-27 15:06:17

只要事件处理程序代码的形式本身,那么你就不会需要退订的事件 - 因为不会有悬空的事件处理程序的控件形式本身将遭到破坏

关于“它实际上是否会递归地处理每个控件?”的问题,答案是肯定的。

一个简单的测试可以通过在控件的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); 
    } 
}