EventHandlers和C#类析构函数/ Dispose

Sar*_*ton 24 c# events delegates winforms

我对C#Classes和它们的解构函数有点困惑.

我必须在构造函数中获取的类实例中使用一些事件处理程序:

 public Foo(IFooHandler handler)
 {
     handler.Load += Load;
     handler.Close += Close;
 }
Run Code Online (Sandbox Code Playgroud)

当Foo类被销毁时,我需要取消订阅该事件.我IDisposable在那里或在解构器中实现和取消订阅吗?我需要消耗那些事件,我不能以另一种方式去做.

对于其中一个类,我创建一个实例,检查进度,然后类实例超出范围.对于另一个,它一直停留在MainForm表格关闭之前.第一个是我担心的,因为它可能仍然有对该事件处理程序的引用而没有正确地去.

我不想泄漏记忆.何时以及如何取消订阅?

Tho*_*que 26

不要在析构函数中执行它,因为在附加事件处理程序时不会调用它:当你附加Foo的实例方法作为Bar事件的处理程序时,Bar将保存对Foo的引用,所以Foo不会被垃圾收集,也不会调用它的析构函数.

您应该实现IDisposable,并显式处理您的对象

public void Dispose()
{
    if (handler != null)
    {
        handler.Load -= Load;
        handler.Close -= Close;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 啊! 除非我们清理非托管代码,否则我认为我们不应该实现IDisposable? (2认同)
  • 要完成Oliver的评论,这里有一个有用的链接:http://msdn.microsoft.com/en-us/library/b1yfkh5e.aspx (2认同)

Ric*_*ler 5

如果您曾经遇到过让 A 类成为长期存在的类而类 B 成为订阅 A 类事件的短期存在的问题,那么您可能会对弱事件模式感兴趣。这可能是一个你直到晚才发现的问题,即普林斯顿自动驾驶汽车。