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

如果我用C#编写实现IDisposable的类,为什么仅仅实现就不够用

public void Dispose(){ ... } 

处理任何非托管资源?

protected virtual void Dispose(bool disposing){ ... }

总是必要的,有时是必要的,或者其他什么东西?


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

这对区分一次性清理和可终结的垃圾收集是捣毁我很有用。

你不必这样做,但你应该阅读它,并理解为什么这是推荐之前,它是不必要的折扣。


包括终结者,引入新的虚拟方法和“密封”原始处置方法的完整模式是非常通用的,涵盖了所有的基础。

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

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

我不记得我最后一次以“复杂”的方式实现IDisposable ,而最明显的方式是这样做,例如

public void Dispose()
{
    somethingElse.Dispose();
}

有一点需要注意的是,如果你要寻找真正健壮的代码,你应该确保在你被抛弃后不会尝试做任何事情,并且在适当的时候抛出ObjectDisposedException 。 对于世界各地的开发人员将使用的类库,这是一个很好的建议,但如果这只是在您自己的工作区中使用的类,那么获得非常少的收获就是很多工作。


关于一次性格局的MSFT文档存在一些偏见。 您应该实施IDisposable有两个原因:

  • 你有一个实现IDisposable的类型的字段
  • 你有一个终结者。
  • 情况1在大多数代码中很常见。 第二种情况在Microsoft编写的代码中很常见,他们是那些在非托管资源周围编写托管包装的人,那些需要最终确定的资源。 但是在你的代码中应该是非常罕见的。 毕竟,你已经拥有了所有那些漂亮的.NET类来为你做肮脏的工作。 你只需要调用他们的Dispose()方法。

    只有情况2需要一次性图案。 微软需要使用它很多。 大部分时间你只需要简单的Dispose()。

    链接地址: http://www.djcxy.com/p/54029.html

    上一篇: What's the point of overriding Dispose(bool disposing) in .NET?

    下一篇: VBA6 Syntax and OPOS Printer OCX Driver in Access 2007