3

System.GC.Collect和 和有什么不一样Dispose()

它们不是用于相同的目的吗?何时应该使用它们;最佳做法是什么?

4

3 回答 3

6

最佳实践是永远不需要调用GC.Collect,并在完成Dispose所有IDisposable对象后调用它们。

于 2013-10-02T06:30:29.153 回答
5

GC.Collect的目的是告诉垃圾收集器内存中有一些对象可以被收集,是时候收集了。不过,根据经验,您应该将其留给 GC 本身。它旨在完成这项工作。

如果您的对象中有一些您认为 GC 不会处理的资源。您应该实施Dispose 并自己处理它们。你需要调用 Dispose Explicitly 来释放你想要的资源。如果你正在实现 IDisposable ,那么你也可以通过Using语句来实现。

于 2013-10-02T06:32:34.337 回答
4

当垃圾收集器要收集内存中的所有对象时,将调用System.GC.Collect 。垃圾收集不考虑托管代码中引用的对象。此方法用于强制系统回收可用内存。

Dispose()不是 GC 的一部分,但作为更好的做法,您可以使用它。它应该只用于使用非托管资源(如 FileStream 等)的对象。它应该释放它拥有的所有资源。当您知道某些资源不会被 GC 释放时,您可以使用 Dispose() 方法。

using语句可确保正确使用 IDisposable 对象。

附带说明: GC 不调用 Dispose,它调用终结器(您应该从 Dispose(false) 调用)

此外,为了确保始终适当地释放资源,Dispose 方法应该可以多次调用而不会引发异常。


MSDN 说:

“可以通过调用 Collect 来强制进行垃圾回收,但大多数情况下,应该避免这样做,因为它可能会产生性能问题。”

检查这个博客: -

GC.Collect() 要求系统“现在”执行收集。你不应该搞砸这个;对于何时需要收集,系统通常比您有更好的想法。

最佳实践也是如此:

您可以使用using块或如您提到的使用Dispose方法。

为什么要使用 IDisposable 和 Dispose?

MSDN

在许多情况下,可能需要通过实现 IDisposable 接口来最终确定对象以避免该成本。该接口提供了一种替代方法来回收资源,其生命周期对于程序员来说是众所周知的,而且这种情况实际上发生了很多。当然,如果您的对象仅使用内存并因此根本不需要完成或处置,那就更好了;但是,如果最终化是必要的,并且在很多情况下明确管理对象既简单又实用,那么实现 IDisposable 接口是避免或至少降低最终化成本的好方法。

还可以查看这篇关于使用 finalize/dispose 模式提高垃圾收集器性能的文章

于 2013-10-02T06:29:19.670 回答