什么时候应该使用GC.SuppressFinalize()?

在.NET中,我应该在哪种情况下使用GC.SuppressFinalize()

使用这种方法有什么好处给我?

SuppressFinalize只能由具有终结器的类调用。 它通知垃圾收集器(GC)完全清理了this对象。

当你有一个终结者时,推荐的IDisposable模式是:

 public class MyClass : IDisposable { private bool disposed = false; protected virtual void Dispose(bool disposing) { if (!disposed) { if (disposing) { // called via myClass.Dispose(). // OK to use any private object references } // Release unmanaged resources. // Set large fields to null. disposed = true; } } public void Dispose() // Implement IDisposable { Dispose(true); GC.SuppressFinalize(this); } ~MyClass() // the finalizer { Dispose(false); } } 

通常,CLR会在创build时使用终结器来保持对象的标签(使其创build成本更高)。 SuppressFinalize告诉GC该对象被正确清理,不需要进入终结器队列。 它看起来像一个C ++析构函数,但并不像一个。

SuppressFinalize优化不是微不足道的,因为您的对象可以在终结器队列中等待很长时间。 不要试图在其他对象上调用SuppressFinalize。 这是一个等待发生的严重缺陷。

devise指导方针告诉我们,如果你的对象实现了IDisposable,那么不需要终结器,但是如果你有一个终结器,你应该实现IDisposable来允许确定性的清除你的类。

大多数情况下,您应该能够使用IDisposable来清理资源。 你只需要一个终结器,当你的对象持有非托pipe资源,你需要保证这些资源被清理。

注意:有时编码器会添加一个终结器来debugging他们自己的IDisposable类的构build,以便testing代码已经正确放置了它们的IDisposable对象。

  public void Dispose() // Implement IDisposable { Dispose(true); #if DEBUG GC.SuppressFinalize(this); #endif } #if DEBUG ~MyClass() // the finalizer { Dispose(false); } #endif 

你告诉系统,在终结器中做的任何工作都已经完成了,所以终结器不需要被调用。 从.NET文档:

实现IDisposable接口的对象可以从IDisposable.Dispose方法调用此方法,以防止垃圾收集器在不需要它的对象上调用Object.Finalize。

一般来说,大多数Dispose()方法都应该能够调用GC.SupressFinalize(),因为它应该清理在终结器中清理的所有东西。

SupressFinalize只是提供了一个优化,允许系统不麻烦排队的对象终结线程。 正确编写的Dispose()/ finalizer应该可以在GC.SupressFinalize()调用或不调用的情况下正常工作。

一般在实现IDisposable模式的时候,你不需要最终确定你的对象。 查看http://www.blackwasp.co.uk/IDisposable.aspx的例子。

必须在实现IDisposable的对象的Dispose方法上调用该方法,这样如果有人调用Dispose方法,GC将不会再调用终结器。

请参阅: http : //msdn.microsoft.com/zh-CN/library/system.gc.suppressfinalize.aspx