System.GC.Collect
和 Dispose()
有什么区别?
它们的用途不同吗?应该在何时使用它们?最佳实践是什么?
System.GC.Collect
和 Dispose()
有什么区别?
它们的用途不同吗?应该在何时使用它们?最佳实践是什么?
最佳实践是尽可能避免调用GC.Collect
,并在完成后对所有IDisposable
对象调用Dispose
。
using
语句块,它们是安全的异常处理方式。 - Uwe KeimSystem.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模式提高垃圾回收器性能
SafeHandle
中。不需要析构函数。 - H H