System.GC.Collect
和Dispose()
之间的区别是什么?
它们是否用于同一目的,何时应使用;什么是最佳做法?
答案 0 :(得分:6)
最佳做法是永远不需要致电GC.Collect
,并在完成所有Dispose
个对象后致电IDisposable
。
答案 1 :(得分:5)
GC.Collect 的目的是告诉垃圾收集器内存中有一些可以收集的对象,现在是收集的正确时间。虽然,根据经验,你应该把它留给GC本身。它旨在完成这项工作。
如果对象中有某些资源,您认为GC不会处理。您应该实施自行处理并自行处理。您需要显式调用Dispose来处置所需的资源。如果您正在实施IDisposable,那么您也可以通过使用语句来实现。
答案 2 :(得分:4)
System.GC.Collect 。在托管代码中引用的对象不考虑用于垃圾收集。此方法用于强制系统回收可用内存。
Dispose()不是GC的一部分,但作为更好的做法,您可以使用它。它应该只用于使用非托管资源(如FileStream等)的对象。它应该释放它拥有的所有资源。当您知道GC不会释放某些资源时,您可以使用Dispose()方法。
using语句可确保正确使用IDisposable对象。
旁注: GC不会调用Dispose,它会调用终结器(您应该从Dispose调用(false))
另外,为了确保资源总是被适当地释放,Dispose方法应该可以多次调用而不会抛出异常。
MSDN说:
“可以通过调用Collect来强制进行垃圾收集,但是 大部分时间,这应该避免,因为它可能会创建 性能问题。 “强>
选中blog: -
GC.Collect()要求系统“立即”执行集合。您 不应该搞乱这个;系统通常有一个更好的主意 比收集时需要的那样。
这是最佳做法:
您可以使用使用块或如您所述使用 Dispose 方法。
为什么要使用IDisposable和Dispose?
MSDN说
在许多情况下,对象可能总是如此 需要最终确定,以通过实施 IDisposable接口。该接口提供了另一种方法 用于回收其生命周期众所周知的资源 程序员,这实际上发生了很多。当然是 如果你的对象只使用内存,那么更好 根本不需要最终确定或处置;但如果最终确定 必要的,有很多案例明确管理你的 对象简单实用,然后实现IDisposable 界面是避免或至少减少最终化的好方法 成本。
另请参阅Improve garbage collector performance using finalize/dispose pattern
上的这篇文章