100 votes

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 s’il est fait référence à un objet éliminé?

PS - Ceci est juste une curiosité (dors bien, pas dans le code de production). Oui, je sais que je peux attraper les ObjectDisposedException lorsque j'essaie d'accéder à un membre de l'objet.

51voto

Dandikas Points 1074

Non - l'implémentation par défaut du modèle IDisposable ne le prend pas en charge

44voto

Kyralessa Points 76456

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

20voto

Scott Dorman Points 25000

Il n'y a rien d'intégré qui permette cela. Vous devez exposer une propriété booléenne IsDisposed qui reflète un indicateur interne éliminé.

 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);
    }
}
 

9voto

jop Points 31978

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

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

-1voto

JeffreyDurham Points 1

Ce que j'aime faire, c'est déclarer les objets sans les initialiser, mais définir leurs valeurs par défaut sur Nothing. Puis, à la fin de la boucle, j’écris: Si anObject n’est rien, alors anObject.Dispose ()

 Public Sub Example()
    Dim inputPdf As PdfReader = Nothing, inputDoc As Document = Nothing, outputWriter As PdfWriter = Nothing

    'code goes here that may or may not end up using all three objects, 
    ' such as when I see that there aren't enough pages in the pdf once I open  
    ' the pdfreader and then abort by jumping to my cleanup routine using a goto ..

GoodExit:
    If inputPdf IsNot Nothing Then inputPdf.Dispose()
    If inputDoc IsNot Nothing Then inputDoc.Dispose()
    If outputWriter IsNot Nothing Then outputWriter.Dispose()
End Sub
 

Cela fonctionne également très bien pour placer vos objets principaux au sommet d’une routine, puis les utiliser dans une routine d’essai, puis les placer dans un bloc final.

 Private Sub Test()
    Dim aForm As System.Windows.Forms.Form = Nothing
    Try
        Dim sName As String = aForm.Name  'null ref should occur
    Catch ex As Exception
        'got null exception, no doubt
    Finally
        'proper disposal occurs, error or no error, initialized or not..
        If aForm IsNot Nothing Then aForm.Dispose()
    End Try
End Sub
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X