我有以下类(class)
public class Presenter: IDisposable
{
public IView View
{get;private set;}
//snip other object reference, all managed
public Presenter(IView view)
{
View=view;
View.MouseUp += MouseUpEvent;
}
public void MouseUpEvent()
{
//do whatever you want to do on mouse up
}
public void Dispose()
{
View.MouseUp -= MouseUpEvent;
// no more manual disposing
}
}
现在的问题是,我是否正确地实现了 Dispose()
方法?或者我是否需要手动处置所有其他托管对象只是因为我明确定义了 Dispose()
?
我认为 GC 足够聪明,可以自行处理(事件订阅除外),甚至无需我手动处理。我说得对吗?
最佳答案
如果您选择在构造函数中进行订阅,那么这看起来很合理。我同意 Josh 的观点,即这可能不是最好的方法。另一方面,它可能是实现目标的最简单方法,这总是一件好事。我不会假装自己是 UI 模式专家:在提出问题后,我会假设这是您想要的工作方式,并解决问题本身:)
我个人认为 Josh 规定的模式1 对于简单场景来说过于复杂 - 你的方法很好,只有一个改变:密封你的类。如果您不想想要密封类,您应该使用Dispose(bool)
选项(但没有终结器),因为子类可能也需要处理一些东西,并且可能需要一个终结器。没有派生类型的可能性,生活会更简单(通常如此)。
您不需要与其他成员做任何事情,仅仅因为您现在为此实现了 IDiposable
。
那么,您是否需要从这个类进一步派生?
1 我知道这是标准推荐模式,但我建议您阅读 Joe Duffy et al 的建议了解更多细节 - 这一切都可能变得非常复杂。
关于c# - 使用 IDisposable 取消订阅事件——我是否需要将其他东西放入处理中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2054892/