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

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

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

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

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


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

一般来说, Dispose旨在加快释放外部资源,例如文件句柄,信号量,数据库句柄以及操作系统经常分配的其他项目。 如果您的对象持有其他IDisposable对象,则它应该将它们置于其调用中以处置。

然而,Finalizer是不同的:它被称为垃圾收集的一部分,用于释放在处理过程中尚未释放的外部资源(可能是因为用户忘记调用Dispose )。 终结器不得调用Dispose对象可能拥有的其他对象,因为它们正在进行垃圾回收。


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

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


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

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

这里的MSDN写法演示了典型的处理模式。

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

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

链接地址: http://www.djcxy.com/p/9237.html

上一篇: Calling Dispose method will clear and compact the memory in .Net?

下一篇: Nulling Out Managed Resources on Dispose