[c#] Come si fa a sapere se un riferimento a un oggetto IDisposable è disposto?


Answers

No: l'implementazione predefinita di pattern IDisposable non la supporta

Question

Esiste un metodo, o qualche altro modo leggero, per verificare se un riferimento è a un oggetto disposto?

PS - Questa è solo una curiosità (dormi bene, non nel codice di produzione). Sì, so che posso catturare ObjectDisposedException quando ObjectDisposedException ad accedere a un membro dell'oggetto.




Non c'è niente di costruito che permetta questo. È necessario esporre una proprietà booleana IsDisposed che rifletta un flag disposto interno.

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



Il metodo Dispose è necessario per eseguire qualsiasi operazione di pulizia sarà richiesta prima che un oggetto venga abbandonato; se non è richiesta alcuna pulizia, non è necessario fare nulla. Richiedere un oggetto per tenere traccia di se è stato eliminato, anche quando il metodo Dispose non farebbe altrimenti nulla, richiederebbe molti oggetti IDisposable per aggiungere un flag per un beneficio molto limitato.

Potrebbe essere stato utile se IDisposable includesse due proprietà, una che indicava se un oggetto necessitava di smaltimento , e una delle quali indicava che l'oggetto non era stato reso inutilizzabile dalla disposizione. Per oggetti in cui lo smaltimento effettivamente fa qualcosa, entrambi i valori sarebbero inizialmente veri e diventerebbero falsi dopo Dispose . Per gli oggetti in cui lo smaltimento non ha bisogno di eseguire alcuna pulizia, il primo metodo potrebbe sempre restituire false e il secondo sempre sempre true, senza dover memorizzare un flag ovunque. Non penso che ci sia un modo in cui possono essere aggiunti a .NET ora, però.




Links