EventHandlers和C#Classes析构函数/ Dispose

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

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

public Foo(IFooHandler handler) { handler.Load += Load; handler.Close += Close; } 

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

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

我不想泄漏内存。 何时以及如何取消订阅?

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

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

 public void Dispose() { if (handler != null) { handler.Load -= Load; handler.Close -= Close; } } 

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