【问题标题】:Garbage collection concept [duplicate]垃圾收集概念 [重复]
【发布时间】:2013-10-06 10:08:09
【问题描述】:

Finalize() -
此函数仅在垃圾收集过程中清理非托管资源 -
用户不知道该方法何时实际执行.
而且用户不能直接调用这个函数来清理内存。

Dispose() -
通过实现 IDisposable 接口,用户可以清理 UnManaged Resources,用户可以准确地知道资源何时被释放。

我的理解是 Finalize() 不能被覆盖以清理非托管资源。
这是一个系统进程,仅用于 'GC' 进程将用于清理非托管资源。
如果用户需要自己清理资源,那么他/她应该实现 IDisposable 接口并显式调用 Dispose()。没有其他可能!
清理非托管资源的最佳做法是使用“USING”语句。

问题 1: 我的理解正确吗?如果我错了,请纠正我的上述陈述。

问题 2: 另外,我想知道,我可以通过实现 IDisposable 接口和调用 Dispose() 来清理 托管资源 吗?

【问题讨论】:

  • 最后这两种方法都释放了非托管资源。一件事是区分 Finalize() 和 Dispose() 的用法
  • Dispose() 是唯一释放非托管资源的方法,它应该在您杀死一个对象时显式调用。 Finalize() 由 CLR 调用,虽然它会调用 Dispose(),但依赖 Finalize()(因此不自己调用 Dispose())意味着您完全无法控制何时释放非托管资源。这可能意味着您不必要地打开数据库连接等。因此:当您拥有非托管资源时,请同时实现 IDisposable 和 Finalize(),并确保您的调用者调用 Dispose()。
  • 嗯,Object.Finalize() 总是被覆盖。实际上,这样做在 99.99% 的情况下都是错误的。似乎无法摆脱的 .NET 1.x 细节。可终结的资源应该有自己的包装类,从 SafeHandle 和朋友开始。

标签: c# garbage-collection dispose finalize


【解决方案1】:

Finalize 不会清理内存。它处理非托管资源。在 .NET 应用程序中,内存是托管资源,分配和释放内存由运行时处理。你不必做任何特别的事情。垃圾收集器将在对象符合收集条件时回收内存。

这导致了您第二个问题的答案:不,您不能使用IDisposable 清理内存,因为内存是通过垃圾收集自动回收的。使用IDisposable处理句柄等GC不处理的资源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 2013-07-03
    • 1970-01-01
    相关资源
    最近更新 更多