在.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有两个原因:
情况1在大多数代码中很常见。 第二种情况在Microsoft编写的代码中很常见,他们是那些在非托管资源周围编写托管包装的人,那些需要最终确定的资源。 但是在你的代码中应该是非常罕见的。 毕竟,你已经拥有了所有那些漂亮的.NET类来为你做肮脏的工作。 你只需要调用他们的Dispose()方法。
只有情况2需要一次性图案。 微软需要使用它很多。 大部分时间你只需要简单的Dispose()。
链接地址: http://www.djcxy.com/p/54029.html上一篇: What's the point of overriding Dispose(bool disposing) in .NET?