Dispose () sera-t-il appelé dans une instruction using avec un objet nul?


179

Est-il sûr d'utiliser l' usinginstruction sur un objet (potentiellement) nul?
Prenons l'exemple suivant:

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

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

Est-il garanti qu'il Disposene sera appelé que si l'objet n'est pas nul et que je n'obtiendrai pas de NullReferenceException?


Réponses:


172

Oui, Dispose()n'est appelé que sur les objets non nuls:

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


30
Notez que même si votre variable est nulle, le bloc using est exécuté, et si vous référencez votre variable à l'intérieur du bloc using sans le vérifier d'abord par null, vous obtiendrez NullReferenceException. Pour éviter toute erreur d'interprétation, cette réponse doit indiquer: "Oui, Dispose()n'est appelé que sur des objets non nuls".
surfen

37

L'expansion de usingvérifie que l'objet n'est pas nullavant de l'appeler Dispose, donc oui, c'est sûr.

Dans votre cas, vous obtiendrez quelque chose comme:

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

14

Vous devriez être d'accord avec ça:

using ((IDisposable)null) { }

Aucune exception jetée ici.

Remarque: ne vous méprenez pas avec foreachet IEnumerableoù une exception sera levée.


1

Oui, avant de se débarrasser, la référence sera vérifiée par zéro. Vous pouvez vous examiner en affichant votre code dans Reflector.


-3

Vous n'obtiendrez pas d'exception de référence nulle selon mon expérience. Il sera simplement ignoré.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.