【发布时间】:2013-10-02 06:27:23
【问题描述】:
System.GC.Collect 和Dispose() 有什么区别?
它们不是用于相同的目的吗?何时应该使用它们;最佳做法是什么?
【问题讨论】:
标签: c# .net oop garbage-collection
System.GC.Collect 和Dispose() 有什么区别?
它们不是用于相同的目的吗?何时应该使用它们;最佳做法是什么?
【问题讨论】:
标签: c# .net oop garbage-collection
最佳做法是永远不需要调用GC.Collect,并在处理完所有IDisposable 对象后调用Dispose。
【讨论】:
using块。
GC.Collect的目的是告诉垃圾收集器内存中有一些对象可以收集,是时候收集了。不过,根据经验,您应该将其留给 GC 本身。它旨在完成这项工作。
如果您的对象中有一些您认为 GC 不会处理的资源。您应该自己实施 Dispose 和处理它们。你需要调用 Dispose Explicitly 来释放你想要的资源。如果您正在实现 IDisposable,那么您也可以通过 Using 语句来实现。
【讨论】:
System.GC.Collect 在内存中的所有对象都将被垃圾收集器收集时调用。垃圾收集不考虑托管代码中引用的对象。该方法用于强制系统回收可用内存。
Dispose() 不是 GC 的一部分,但作为更好的做法,您可以使用它。它应该只用于使用非托管资源(如 FileStream 等)的对象。它应该释放它拥有的所有资源。当您知道某些资源不会被 GC 释放时,您可以使用 Dispose() 方法。
using 语句确保正确使用 IDisposable 对象。
附带说明: GC 不调用 Dispose,它调用终结器(您应该从 Dispose(false) 调用它)
另外,为了确保资源总是被适当地释放,Dispose 方法应该可以多次调用而不抛出异常。
MSDN 说:
"可以通过调用Collect来强制进行垃圾回收,但是 大多数情况下,应该避免这种情况,因为它可能会产生 性能问题。 "
检查这个blog:-
GC.Collect() 要求系统“现在”执行收集。你 不应该惹这个;系统通常有一个更好的主意 比你什么时候需要收集。
最佳做法是:
您可以使用 using 块,也可以使用您提到的 Dispose 方法。
为什么要使用 IDisposable 和 Dispose?
MSDN 说
在许多情况下,原本总是 需要最终确定以避免通过实施 IDisposable 接口。该接口提供了另一种方法 用于回收其生命周期众所周知的资源 程序员,这实际上发生了很多。当然是 如果您的对象仅使用内存,则更好,因此 根本不需要最终确定或处置;但如果最终确定是 有必要,并且在很多情况下,显式管理您的 objects 简单实用,然后实现 IDisposable 接口是避免或至少减少终结的好方法 费用。
也可以在Improve garbage collector performance using finalize/dispose pattern查看这篇文章
【讨论】:
SafeHandle 中。不需要析构函数。