La mise en œuvre de IDisposable sur une sous-classe lorsque le parent met également en œuvre IDisposable

J'ai un parent et un enfant de la classe que les deux ont besoin pour mettre en œuvre IDisposable. Où dois - virtual (et base.Dispose()?) les appels entrent en jeu? Quand je viens de remplacer le Dispose(bool disposing) appel, il se sent vraiment étrange disant que je n'en œuvre IDisposable sans avoir explicite Dispose() fonction (juste en utilisant l'héritage), mais ayant tout le reste.

Ce que j'avais fait (à banaliser un peu):

internal class FooBase : IDisposable
{
    Socket baseSocket;

    private void SendNormalShutdown() { }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    private bool _disposed = false;
    protected virtual void Dispose(bool disposing)
    {
        if (!_disposed)
        {
            if (disposing)
            {
                SendNormalShutdown();
            }
            baseSocket.Close();
        }
    }

    ~FooBase()
    {
        Dispose(false);
    }
}

internal class Foo : FooBase, IDisposable
{
    Socket extraSocket;

    private bool _disposed = false;
    protected override void Dispose(bool disposing)
    {
        if (!_disposed)
        {
            extraSocket.Close();
        }
        base.Dispose(disposing);
    }

    ~Foo()
    {
        Dispose(false);
    }

}
  • Msdn a publié des recommandations sur la façon de la sous-classe des objets de mise en œuvre de IDisposable.
InformationsquelleAutor Tanzelax | 2010-03-22