我知道.Net中的Dispose和Finalize方法如下 . 如果我错了,请纠正我 .
Dispose:实现IDisposable接口并在Dispose方法中删除未使用/未管理的代码 . 开发人员需要手动调用它,如果他们想要立即删除,或者GC将在调用时处置资源 .
Finalize:当GC调用时,它将释放未使用的托管代码,如果实现了IDisposable,它将调用Dispose方法释放非托管资源(通常) .
问题是:当我们使用Dispose方法处理资源时,内存将被立即释放并压缩(如GC那样)?
3 回答
你的问题的答案是否定的:释放为对象分配的内存与调用
Dispose
方法无关 . 当垃圾收集器到达它时,它会在适当的时候发生 .一般来说,
Dispose
旨在加速外部资源的释放,例如文件句柄,信号量,数据库句柄以及操作系统通常分配的其他项目 . 如果你的对象持有其他IDisposable
对象,它也应该在它的dispose调用中处理它们 .但是,Finalizer是不同的:它被称为垃圾收集的一部分,用于释放在处置期间尚未释放的外部资源(可能是因为用户忘记调用
Dispose
) . 终结器不能调用您的对象可能拥有的其他对象Dispose
,因为它们正在进行垃圾回收 .不 . 直接或通过using语句调用Dispose方法不会导致释放内存 .
实现IDisposable只会让你的 class 有机会清理它所持有的任何非托管资源 .
你在这里有点不对劲 . 当你说“它将调用Dispose”时,如果你指的是GC本身,那么,不,它不会“自动”为你调用Dispose . 作为程序员,您可以在Dispose和Finalizer方法中进行清理 .
这MSDN writeup here展示了典型的处置模式 .
不,调用Dispose不会释放堆内存 . 在GC运行并执行清理之前,不会释放堆内存 .