问题
See the code sample from MSDN: (http://msdn.microsoft.com/en-us/library/b1yfkh5e(v=VS.100).aspx)
// Design pattern for a base class.
public class Base: IDisposable
{
private bool disposed = false;
//Implement IDisposable.
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// Free other state (managed objects).
}
// Free your own state (unmanaged objects).
// Set large fields to null.
disposed = true;
}
}
// Use C# destructor syntax for finalization code.
~Base()
{
// Simply call Dispose(false).
Dispose (false);
}
}
In the Dispose() implementation it calls GC.SupressFinalize();, but provide a destructor to finalise the object.
What is the point of providing an implementation for the destructor when GC.SuppressFinalize() is called?
Just little bit confused what the intentions are?
回答1:
There are 2 scenarios:
- Your code calls Dispose (preferred) and the Finalizer is canceled, eliminating the overhead.
- Your code 'leaks' the object and the GC calls the Finalizer.
回答2:
If someone forgets to call Dispose, the finalizer will (eventually) run to do final cleanup. Since finalization hurts performance, ideally no-one will forget to Dispose. The using construct helps a little with that.
来源:https://stackoverflow.com/questions/4193755/finalizers-with-dispose-in-c-sharp