【发布时间】: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