189 votes

C#, l’instruction avec un objet null

Est-il sécuritaire d'utiliser l' using énoncé de (potentiellement) objet null?
I. e. considérons 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' Dispose sera appelée que si l'objet n'est pas null, et je ne vais pas obtenir un NullReferenceException?

note: à partir du lien dans la accepté de répondre:

L'exemple de code plus tôt s'étend dans le code suivant au moment de la compilation (note supplémentaires des accolades pour créer de la portée limitée de l'objet): C#

{
  Font font1 = new Font("Arial", 10.0f);
  try
  {
    byte charset = font1.GdiCharSet;
  }
  finally
  {
    if (font1 != null)
      ((IDisposable)font1).Dispose();
  }
}

184voto

reko_t Points 22121

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

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

41voto

João Angelo Points 24422

L’expansion pour vérifie que l’objet n’est pas avant d’appeler `` sur elle, alors oui, c’est sûr.

Dans votre cas, vous obtiendrez quelque chose comme :

18voto

Darin Dimitrov Points 528142

Vous devriez être OK avec elle :

Aucune exception levée ici.

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

1voto

oli Points 56

Oui, avant d’éliminer la référence sera null-vérifié. Vous pouvez vous vérifier en affichant votre code dans le réflecteur.

-2voto

malay Points 764

Vous n’obtiendrez aucune exception de référence null selon mon expérience. Il sera tout simplement ignoré.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X