C# net中的垃圾收集最佳实践

C# net中的垃圾收集最佳实践,c#,.net,oop,garbage-collection,C#,.net,Oop,Garbage Collection,System.GC.Collect和Dispose()之间有什么区别 它们不是用于相同的目的吗?何时应该使用它们;最佳做法是什么 当垃圾收集器要收集内存中的所有对象时,调用System.GC.Collect。托管代码中引用的对象不考虑用于垃圾收集。此方法用于强制系统回收可用内存 Dispose()不是GC的一部分,但作为更好的实践,您可以使用它。它只应用于使用非托管资源(如FileStream等)的对象。它应释放其拥有的所有资源。当您知道GC不会释放某些资源时,可以使用Dispose()方法 该

System.GC.Collect
Dispose()
之间有什么区别


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

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

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

该语句确保正确使用IDisposable对象

另请注意:GC不调用Dispose,它调用终结器(您应该从Dispose调用终结器(false))

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


MSDN说:

“可以通过调用Collect强制垃圾收集,但是 大多数情况下,这应该避免,因为它可能会造成 性能问题。“

选中此项:-

Collect()要求系统“立即”执行收集。你 我们不应该搞砸这件事;系统通常有更好的想法 而不是在需要收集时

最佳实践也是如此:

您可以使用使用块,或者如您所述使用处置方法

为什么要使用IDisposable和Dispose?

在许多情况下,对象可能会始终 需要最终确定,以通过实施 IDisposable接口。此接口提供了另一种方法 用于回收生命周期为用户所熟知的资源 程序员,这实际上发生了很多。当然是 如果您的对象只使用内存,因此 根本不需要最终确定或处理;但如果最终确定是正确的 这是必要的,而且在许多情况下,对您的 对象简单实用,然后实现IDisposable 接口是避免或至少减少终结的好方法 成本


还可以查看这篇文章,最佳实践是永远不需要调用
GC.Collect
,并在处理完所有
IDisposable
对象后调用
Dispose

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


如果您的对象中有一些您认为GC不会处理的资源。您应该实施处理并自己处理它们。您需要显式调用Dispose来处置所需的资源。如果要实现IDisposable,也可以通过使用语句来实现。

或使用使用异常安全的块来实现。正确,但您没有解决GC和IDisposable不能达到相同目的这一事实。这两条准则几乎毫无关联。(几乎)永远不要使用析构函数。@HenkHolterman:-删除了析构函数部分,因为我认为这是误导!这会让我的答案更好吗?是的,但不是我的-1。@Henkholtman:-好的……没问题,先生。可能是那个破坏者也误导了其他人!:)关于你的评论:那已经过时了。当您拥有非托管资源时,请将其包装在
SafeHandle
中。不需要析构函数。埃桑的建议似乎是正确的。我有一个例子,我们迭代地通过一个性能关键部分,然后暂停。在暂停过程中,我们调用GC收集,希望避免系统选择在性能关键部分的中间收集。这似乎是GC.Collect的一个合适的用例。