Dispose () verrà chiamato in un'istruzione using con un oggetto null?


179

È sicuro usare l' usingistruzione su un (potenzialmente) oggetto null?
Considera il seguente esempio:

class Test {
    IDisposable GetObject(string name) {
        // returns null if not found
    }

    void DoSomething() {
        using (IDisposable x = GetObject("invalid name")) {
            if (x != null) {
                 // etc...
            }
        }
    }
}

È garantito che Disposeverrà chiamato solo se l'oggetto non è null e non otterrò un NullReferenceException?


Risposte:


172

Sì, Dispose()viene chiamato solo su oggetti non nulli:

http://msdn.microsoft.com/en-us/library/yh598w02.aspx


30
Nota che anche se la tua variabile è nulla, il blocco using viene eseguito, e se fai riferimento alla tua variabile all'interno del blocco using senza prima controllarlo, otterrai NullReferenceException. Per evitare interpretazioni errate, questa risposta dovrebbe indicare: "Sì, Dispose()viene chiamato solo su oggetti non nulli".
surfato il

37

L'espansione per usingverifica che l'oggetto non sia nullprima di richiamarlo Dispose, quindi sì, è sicuro.

Nel tuo caso otterrai qualcosa del tipo:

IDisposable x = GetObject("invalid name");
try
{
    // etc...
}
finally
{
    if(x != null)
    {
        x.Dispose();
    }
}

14

Dovresti essere d'accordo con questo:

using ((IDisposable)null) { }

Nessuna eccezione generata qui.

Nota a margine: non confondere questo con foreache IEnumerabledove verrà generata un'eccezione.


1

Sì, prima di smaltire il riferimento verrà controllato null. Puoi esaminare te stesso visualizzando il tuo codice in Reflector.


-3

Non otterrai eccezioni di riferimento null secondo la mia esperienza. Sarà semplicemente ignorato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.