最近我和同事就实现Dispose
和实现IDisposable
接口的类型的价值进行了讨论。
我认为对于应该尽快清理的类型,即使没有未受控资源需要清理,实现IDisposable
也是有价值的。
我的同事持不同意见。他认为如果没有未受控资源,实现IDisposable
是不必要的,因为您的类型最终会被垃圾回收。
我的观点是,如果您想尽快关闭ADO.NET连接,则实现IDisposable
并使用using new MyThingWithAConnection()
是有意义的。 我的同事回答说,在内部,ADO.NET连接是一个未受控资源。而我回复他的回答是最终所有东西都是未受控资源。
我知道有推荐的可释放模式,在这种模式下,如果调用Dispose
,则释放托管和未托管资源,但只释放未受控资源如果通过终结器/destructor调用它(并且一段时间以前我在博客中分享了如何警告使用您的IDisposable类型的不当方式的消费者)。
那么,我的问题是,如果您有一个不包含未受控资源的类型,是否值得实现IDisposable
?
IDisposable
的唯一另一个场合,是在处理非托管资源之外,当我需要确保事件被正确取消订阅以便类可以被垃圾回收时。但这实际上是语言的缺陷:事件真的真的 非常 需要弱引用,但它们并没有。 - BlueRaja - Danny Pflughoeft