2010-03-26 3 views
128

Est-il prudent d'utiliser l'instruction using sur un objet (potentiellement) nul?
Prenons l'exemple suivant:Utilisation de l'instruction avec un objet nul

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ée que si l'objet est non nul, et je ne vais pas obtenir un NullReferenceException?

+3

Je vous suggère de l'essayer ... Vous avez la plupart du code dont vous avez besoin là – cjk

+0

En relation http://stackoverflow.com/questions/2513035 –

Répondre

121

Oui, Dispose() est appelée uniquement sur des objets non nuls:

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

+18

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 d'abord le cocher, vous obtiendrez NullReferenceException. Pour éviter toute erreur d'interprétation, cette réponse doit indiquer: "Oui,' Dispose() 'est uniquement appelé sur des objets non nuls". – surfen

8

Vous devriez être ok avec elle:

using ((IDisposable)null) { } 

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

24

L'extension pour using vérifie que l'objet n'est pas null avant d'y 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(); 
    } 
} 
-2

Vous n'obtiendrez exception de référence null selon mon expérience. Ce sera simplement ignoré.

0

Oui, avant de se prononcer la référence sera nulle vérifié. Vous pouvez vous examiner en regardant votre code dans Reflector.

Questions connexes