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
?
Oui, Dispose()
n'est appelé que sur les objets non nuls:
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();
}
}
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.
Oui, avant de supprimer la référence sera vérifiée nulle. Vous pouvez vous examiner en affichant votre code dans Reflector.