垃圾收集.net中的最佳实践

时间:2013-10-02 06:27:24

标签: c# .net oop garbage-collection

System.GC.CollectDispose()之间的区别是什么?

它们是否用于同一目的,何时应使用;什么是最佳做法?

3 个答案:

答案 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

上的这篇文章