调用Dispose方法将清除并压缩.Net中的内存?

时间:2012-02-09 02:39:35

标签: .net garbage-collection idisposable finalizer

我对.Net中的Dispose和Finalize方法有如下想法。如果我错了,请纠正我。

Dispose:实现IDisposable接口并在Dispose方法中删除未使用/未管理的代码。如果想要立即删除,开发人员需要手动调用它,否则GC会在调用资源时处理它们。

Finalize:当GC调用时,它将释放未使用的托管代码,如果实现了IDisposable,它将调用Dispose方法释放非托管资源(通常)。

问题是:当我们使用Dispose方法处理资源时,内存将立即释放并压缩(如GC那样)?

3 个答案:

答案 0 :(得分:5)

你的问题的答案是否定的:释放为对象分配的内存与调用Dispose方法无关。当垃圾收集器到达时,它会在适当的时候发生。

一般来说,Dispose旨在加速外部资源的发布,例如文件句柄,信号量,数据库句柄以及操作系统通常分配的其他项目。如果你的对象持有其他IDisposable个对象,那么它也应该将它们放置在它的dispose调用中。

然而,

Finalizer是不同的:它被称为垃圾收集的一部分,用于释放在处置期间尚未释放的外部资源(可能是因为用户忘记调用Dispose)。终结者不得调用您的对象可能拥有的其他对象的Dispose,因为它们已经被垃圾收集过程。

答案 1 :(得分:2)

没有。直接或通过using语句调用Dispose方法不会导致释放内存。

实施IDisposable只会让你的班级有机会清理它所持有的任何非托管资源。

答案 2 :(得分:1)

  

Finalize:当GC调用时,它将释放未使用的托管代码,如果实现了IDisposable,它将调用Dispose方法释放非托管资源(通常)。

你在这里有点不对劲。当你说“它将调用Dispose”时,如果你指的是GC本身,那么,不,它不会“自动”为你调用Dispose。作为程序员,您可以在Dispose和Finalizer方法中进行清理。

MSDN writeup here展示了典型的处置模式。

  

问题是:当我们使用Dispose方法处理资源时,内存将立即释放并压缩(如GC那样)?

不,调用Dispose不会释放堆内存。在GC运行并执行清理之前,不会释放堆内存。