c# - 使用 IDisposable 取消订阅事件——我是否需要将其他东西放入处理中?

标签 c# winforms dispose

我有以下类(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/

相关文章:

.net - Winforms 表单构造函数与加载事件

java - 登录对话框窗口不会完全处理

c# - GUIDE - 自动化测试网页

c# - 取消 token 抛出异常。无法捕获OperationCanceledException。我遇到了用户未处理的情况

c# - 从另一个表单重新加载组合框项目

c# - 更改拆分器突出显示/调整行大小

android - 为什么在这种情况下处理 DisposableObserver 很重要

c# - MemoryStream、XmlTextWriter 和警告 4 CA2202 : Microsoft. 用法

c# - 获取此格式的日期时间 : 2018-10-26T16:44:38+01:00

c# - 为什么下面的代码编译执行成功了?