首页 文章

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

提问于
浏览
2

我知道.Net中的Dispose和Finalize方法如下 . 如果我错了,请纠正我 .

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

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

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

3 回答

  • 2

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

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

    但是,Finalizer是不同的:它被称为垃圾收集的一部分,用于释放在处置期间尚未释放的外部资源(可能是因为用户忘记调用 Dispose ) . 终结器不能调用您的对象可能拥有的其他对象 Dispose ,因为它们正在进行垃圾回收 .

  • 1

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

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

  • 4

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

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

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

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

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

相关问题