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?

Paolo Tedesco
la source
1
Related stackoverflow.com/questions/2513035
Brian Rasmussen

Réponses:

172

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

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

reko_t
la source
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();
    }
}
João Angelo
la source
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.

Darin Dimitrov
la source
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.

Oli
la source
-3

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

malais
la source