为什么我们需要对某些对象使用Dispose()方法?垃圾收集器为什么不这样做?

时间:2010-01-04 10:07:35

标签: c# garbage-collection dispose

问题是:为什么我们需要在某些对象上调用Dispose()?为什么垃圾收集器在超出范围时收集它?我试图理解为什么它被实现的原因。我的意思是,当垃圾收集器从范围对象中收集时调用Dispose()会不会更容易。

2 个答案:

答案 0 :(得分:21)

垃圾收集器是非确定性的 - 它在不再引用后在某点收集对象,但不能保证及时发生。与引用计数相比,这有许多好处,包括允许循环依赖性和不在整个地方递增和递减计数器的性能优势。

但是,它确实意味着对于应该及时清理的资源(例如数据库连接,文件句柄等 - 几乎除了内存之外的其他任何东西),你仍然需要明确处理资源。 using语句使这很容易。

答案 1 :(得分:7)

Dispose用于清理非托管资源(例如数据库连接的包装器,旧的COM库,......)。

修改 一些MSDN链接有更多细节:
http://msdn.microsoft.com/en-us/library/b1yfkh5e(VS.71).aspx
http://msdn.microsoft.com/en-us/library/0xy59wtx(VS.71).aspx

要指定垃圾回收器回收对象时非托管资源会发生什么,您必须覆盖受保护的Finalize()方法: http://msdn.microsoft.com/en-us/library/system.object.finalize(VS.71).aspx