【发布时间】:2012-05-06 04:22:20
【问题描述】:
我最近和一位同事讨论了Dispose 的值以及实现IDisposable 的类型。
我认为对于应该尽快清理的类型实现IDisposable 是有价值的,即使没有要清理的非托管资源。
我的同事想法不同;如果您没有任何非托管资源,则无需实施IDisposable,因为您的类型最终将被垃圾回收。
我的论点是,如果您有一个想要尽快关闭的 ADO.NET 连接,那么实现 IDisposable 和 using new MyThingWithAConnection() 将是有意义的。我的同事回答说,ADO.NET 连接实际上是一个非托管资源。我对他的回复是 一切最终都是非托管资源。
我知道recommended disposable pattern,您如果调用Dispose,则释放托管和非托管资源,但如果通过终结器/析构函数调用,则仅释放非托管资源 (不久前还写了一篇关于如何alert consumers of improper use of your IDisposable types的博客)
所以,我的问题是,如果你有一个不包含非托管资源的类型,是否值得实现IDisposable?
【问题讨论】:
-
正如您正确指出的,ADO 连接是非托管资源。
-
@KonradRudolph - 不。连接称为托管资源。它包含(拥有)非托管资源,尽管可能间接通过 SafeHandle。
-
@Henk 这就是我的意思——我应该更仔细地措辞,但在问题中它已经以正确的方式措辞了。
-
在非托管资源之外,我唯一需要
IDisposable的时候是我需要确保正确取消订阅事件以便可以对类进行垃圾收集。但这确实是语言的失败:事件真的 REALLY 需要是弱引用,但事实并非如此。
标签: c# garbage-collection idisposable finalizer finalization