在.NET中重写Dispose(bool disposing)有什么意义?

Mar*_*ter 41 .net c# dispose idisposable

如果我在C#中编写一个实现IDisposable的类,为什么我不能简单地实现

public void Dispose(){ ... } 
Run Code Online (Sandbox Code Playgroud)

处理释放任何非托管资源?

protected virtual void Dispose(bool disposing){ ... }
Run Code Online (Sandbox Code Playgroud)

总是必要的,有时是必要的,还是其他的东西?

Jon*_*eet 43

包括终结器,引入新的虚拟方法和"封装"原始处置方法的完整模式是非常通用的,涵盖所有基础.

除非你有非托管资源的直接句柄(几乎 应该),否则你不需要终结器.

如果你密封你的班级(我现在可能已经知道我对密封类的看法 - 继承设计或禁止它),引入虚拟方法是没有意义的.

我不记得上次我IDisposable以"复杂"的方式实施而不是以最明显的方式实施,例如

public void Dispose()
{
    somethingElse.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

有一点需要注意的是,如果您要使用非常强大的代码,那么您应该确保在处理后不要尝试做任何事情,并ObjectDisposedException在适当的时候抛出.对于世界各地的开发人员都会使用的类库来说,这是一个很好的建议,但如果这只是一个在你自己的工作区中使用的类,那么很多工作只会获得很少的收益.


Ham*_*ith 31

这不是绝对必要的.它是推荐的Disposable模式的一部分.如果你还没有阅读关于这个的框架设计指南部分(第一版中的9.3,没有第二版方便对不起),那么你应该.试试这个链接.

它有助于区分一次性清理和可最终确定的垃圾收集 - 垃圾 - 我.

您不必这样做,但是您应该阅读它并理解为什么在将其作为不必要的折扣之前建议这样做.

  • "IDisposable:你的母亲从未告诉过你关于资源重新分配的内容"的链接太远了,所以我将在这里复制它:http://www.codeproject.com/KB/dotnet/IDisposable.aspx (3认同)

Han*_*ant 14

MSFT文档中关于一次性模式存在一些偏见.您应该实现IDisposable有两个原因:

  1. 你有一个实现IDisposable类型的字段
  2. 你有一个终结者.

案例1在大多数代码中都很常见.案例2在Microsoft编写的代码中非常常见,它们是围绕非托管资源编写托管包装的代码,需要完成的代码.但是在你的代码中应该是非常罕见的.毕竟,你已经拥有了所有那些不错的.NET类来为你做脏工作.你只需要调用他们的Dispose()方法.

仅案例2需要一次性图案.微软需要经常使用它.你大部分时间都只需要简单的Dispose().

  • 单击"提问"按钮以提出问题. (3认同)

Hos*_*Aly 5

除了其他很棒的答案,您可能需要查看这些文章:

  • 第一篇文章仍然包含简单处理案例中的"处置"属性,这是毫无意义的.非常简单的情况是Jon在他的例子中添加了'virtual'关键字. (2认同)