Est-il sécuritaire d’utiliser l’instruction using
sur un object (potentiellement) nul?
Prenons l’exemple suivant:
class Test { IDisposable GetObject(ssortingng name) { // returns null if not found } void DoSomething() { using (IDisposable x = GetObject("invalid name")) { if (x != null) { // etc... } } } }
Est-il garanti que Dispose
ne sera appelé que si l’object n’est pas nul et que je ne NullReferenceException
pas une NullReferenceException
?
Oui, Dispose()
est uniquement appelé sur des objects non nuls:
L’expansion pour l’ using
vérifie que l’object n’est pas null
avant d’appeler Dispose
, donc oui, c’est sûr.
Dans votre cas, vous obtiendriez quelque chose comme:
IDisposable x = GetObject("invalid name"); try { // etc... } finally { if(x != null) { x.Dispose(); } }
Vous devriez être d’accord avec ça:
using ((IDisposable)null) { }
Aucune exception lancée ici.
Note latérale: ne confondez pas ceci avec foreach
et IEnumerable
où une exception sera lancée.
Oui, avant de jeter la référence sera vérifiée par null. Vous pouvez vous examiner en consultant votre code dans Reflector.
Vous n’obtiendrez pas d’exception de référence null selon mon expérience. Il sera simplement ignoré.