web-dev-qa-db-fra.com

Utilisation d'une instruction avec un objet nul

Est-il sûr d'utiliser l'instruction using sur un objet (potentiellement) nul?
Considérez 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 que Dispose sera appelé uniquement si l'objet n'est pas nul et que je n'obtiendrai pas NullReferenceException?

163
Paolo Tedesco

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

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

156
reko_t

L'expansion de using vérifie que l'objet n'est pas null avant d'appeler Dispose dessus, 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();
    }
}
30
João Angelo

Vous devriez être d'accord avec ça:

using ((IDisposable)null) { }

Aucune exception levée ici.

Remarque: ne confondez pas cela avec foreach et IEnumerable où une exception sera levée.

13
Darin Dimitrov

Oui, avant de supprimer la référence sera vérifiée nulle. Vous pouvez vous examiner en affichant votre code dans Reflector.

1
oli