我对C#Classes及其解构函数感到有点困惑。
我必须在构造函数中使用的类实例中使用一些事件处理程序:
public Foo(IFooHandler handler)
{
handler.Load += Load;
handler.Close += Close;
}
当Foo类被销毁时,我需要取消订阅该事件。我在那里实施IDisposable
并取消订阅,还是在解构器中?我需要消费这些事件,我不能以另一种方式去做。
对于其中一个类,我创建一个实例,检查进度,然后类实例超出范围。对于另一个,它将保留在MainForm
,直到表单关闭。第一个是我担心的,因为它可能仍然有对该事件处理程序的引用而且没有正确地进行。
我不想泄漏内存。何时以及如何取消订阅?
答案 0 :(得分:26)
不要在析构函数中执行它,因为在附加事件处理程序时不会调用它:当您附加Foo的实例方法作为Bar事件的处理程序时,Bar将保存对Foo的引用,所以Foo不会被垃圾收集,也不会调用它的析构函数。
您应该实现IDisposable,并明确处置您的对象
public void Dispose()
{
if (handler != null)
{
handler.Load -= Load;
handler.Close -= Close;
}
}
答案 1 :(得分:3)
如果你曾经遇到过让A类成为一个长期存在的类和类的问题,那么B是订阅A类事件的短命类型,那么你可能会对Weak Event Pattern感兴趣。这可能是一个你没有发现的问题,直到它迟到,即Princeton self driving car.