web-dev-qa-db-fra.com

Comment savoir si une référence d'objet IDisposable est supprimée?

Existe-t-il une méthode, ou une autre méthode légère, pour vérifier si une référence concerne un objet jeté?

P.S. - C'est juste une curiosité (bien dormir, pas dans le code de production). Oui, je sais que je peux attraper le ObjectDisposedException en essayant d'accéder à un membre de l'objet.

80
Neil C. Obremski

System.Windows.Forms.Control A une propriété IsDisposed qui est définie sur true après l'appel de Dispose() . Dans vos propres objets IDisposable, vous pouvez facilement créer une propriété similaire.

38
Ryan Lundy

Il n'y a rien de intégré qui permettra cela. Vous devez exposer une propriété booléenne IsDisposed qui reflète un indicateur disposé en interne.

public class SimpleCleanup : IDisposable
{
    private bool disposed = false;

    public bool IsDisposed
    {
       get
       {
          return disposed;
       }
    }

    public SimpleCleanup()
    {
        this.handle = /*...*/;
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
               // free only managed resources here
            }

            // free unmanaged resources here
            disposed = true;
        }
    }

    public void Dispose()
    {
        Dispose(true);
    }
}
18
Scott Dorman

Si ce n'est pas votre classe et qu'elle ne fournit pas de propriété IsDisposed (ou quelque chose de similaire - le nom n'est qu'une convention), alors vous n'avez aucun moyen de le savoir.

Mais si c'est votre classe et que vous suivez implémentation canonique IDisposable , alors exposez simplement le champ _disposed ou _isDisposed en tant que propriété et vérifiez cela.

9
jop

La méthode Dispose est requise pour effectuer le nettoyage requis avant l'abandon d'un objet; si aucun nettoyage n'est requis, il n'est pas nécessaire de faire quoi que ce soit. Obliger un objet à savoir s'il a été supprimé, même si la méthode Dispose ne ferait rien autrement, nécessiterait de nombreux objets IDisposable pour ajouter un indicateur pour un avantage très limité.

Cela aurait pu être utile si IDisposable incluait deux propriétés - l'une qui indiquait si un objet à éliminer, et l'autre indiquant que l'objet n'avait pas été rendu inutile par élimination. Pour les objets où l'élimination fait réellement quelque chose, les deux valeurs seraient initialement vraies et deviendraient fausses après Dispose. Pour les objets dont l'élimination n'a pas besoin de faire de nettoyage, la première méthode peut toujours retourner false et la seconde toujours true, sans avoir à stocker un indicateur n'importe où. Je ne pense pas qu'il y ait aucun moyen de les ajouter à .NET maintenant, cependant.

2
supercat

Je vois que c'est vieux, mais je n'ai pas vu de réponse. Certains objets jetables comme un DataSet n'ont pas tous un événement supprimé que vous pouvez attacher.

class DisposeSample : IDisposable
{
    DataSet myDataSet = new DataSet();
    private bool _isDisposed;

    public DisposeSample()
    {
        // attach dispose event for myDataSet
        myDataSet.Disposed += MyDataSet_Disposed;
    }

    private void MyDataSet_Disposed(object sender, EventArgs e)
    {
        //Event triggers when myDataSet is disposed
        _isDisposed = true; // set private bool variable as true 
    }


    public void Dispose()
    {
        if (!_isDisposed) // only dispose if has not been disposed;
            myDataSet?.Dispose(); // only dispose if myDataSet is not null;
    }
}
1
Moses