我的代码如下:
class MyPresenter
{
public MyPresenter(IViewFactory viewFactory, ...)
{
_view = viewFactory.GetMyView();
_view.OkClicked += OnOkClicked;
_view.CancelClicked += OnCancelClicked;
...
}
public ShowView()
{
...
_view.ShowDialog();
}
}
是否有必要在某处放置-=
?如果是这样,将它放入终结器中是否有意义?
答案 0 :(得分:2)
当假定订阅对象的生命周期短于触发事件的对象的生命周期时,从事件中取消注册非常重要。
一个很好的例子是App.Idle
。 App
在您的Windows窗体应用程序的整个生命周期中都存在。如果您在此事件上注册,则App现在具有对所述对象的引用,即,如果您不注销,则您的对象假定与App相同的生命周期。
我想指出Windows.Forms "memory leaks"上的帖子。请注意,这些并不能证明垃圾收集器有任何问题,但是存在一些极端情况,其中非托管代码并不遥远,或者当您遇到有关事件的终身问题时。