WinForms:我应该总是取消注册事件回调吗?

时间:2011-04-14 08:08:00

标签: c# winforms event-handling mvp

我的代码如下:

class MyPresenter
{
    public MyPresenter(IViewFactory viewFactory, ...)
    {
        _view = viewFactory.GetMyView();
        _view.OkClicked += OnOkClicked;
        _view.CancelClicked += OnCancelClicked;
        ...
    }


    public ShowView()
    {
        ...
        _view.ShowDialog();  
    }
}

是否有必要在某处放置-=?如果是这样,将它放入终结器中是否有意义?

1 个答案:

答案 0 :(得分:2)

假定订阅对象的生命周期短于触发事件的对象的生命周期时,从事件中取消注册非常重要。

一个很好的例子是App.IdleApp在您的Windows窗体应用程序的整个生命周期中都存在。如果您在此事件上注册,则App现在具有对所述对象的引用,即,如果您不注销,则您的对象假定与App相同的生命周期。

我想指出Windows.Forms "memory leaks"上的帖子。请注意,这些并不能证明垃圾收集器有任何问题,但是存在一些极端情况,其中非托管代码并不遥远,或者当您遇到有关事件的终身问题时。