事件处理器和C#类析构函数/处置(EventHandlers and C# Classes dest

2019-08-01 10:54发布

我有点困惑的C#类及其解构。

我有一个类的实例我得到在构造函数中消耗了几个事件处理程序:

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

我需要在Foo类被破坏退订该事件。 难道我实现IDisposable和退订那里,或者在解构? 我需要消耗这些事件,我不能这样做的另一种方式。

对于一个类,我创建一个实例,检查进度,然后类实例超出范围。 而另一个则留在MainForm ,直到窗体关闭。 首先是我很担心,因为它可能仍然有该事件处理程序的引用,而不是正确地去。

我不想泄漏内存。 当我应该怎么退订?

Answer 1:

不这样做,在析构函数,因为它不会被调用,而事件处理程序附:当你连接符的一个实例方法,作为律师的事件的处理程序,酒吧将举行到foo的引用,所以富不会被垃圾收集,它的析构函数不会被调用。

你应该实现IDisposable,并明确处置你的对象

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


Answer 2:

如果你有面对A级是一个长期居住类和类(ES)B时短命的那些认购A类的事件,那么你可能会感兴趣的问题弱事件模式 。 它可以是你没有发现是一个直到后期即问题普林斯顿自驾车。



文章来源: EventHandlers and C# Classes destructor/Dispose