397 votes

En c#, ce qui se passe lorsque vous appelez une méthode d’extension sur un objet null ?

Est la méthode appelée avec une valeur null ou donne-t-il une exception de référence null ?

Si c’est le cas, je vais devoir jamais vérifier mon « Thi » paramètre null ?

462voto

Marc Gravell Points 482669

Qui fonctionne parfaitement (sans exception). Méthodes d’extension ne pas utiliser les appels virtuels (c'est-à-dire qu’il utilise le « appelez » instruction de langage, pas « callvirt ») donc il n’y a aucun contrôle null sauf si vous l’écrire vous-même dans la méthode d’extension. C’est réellement utile dans certains cas :

etc.

Fondamentalement, les appels aux appels statiques sont très littérales - c'est-à-dire

devient :

où il n’y a évidemment aucun contrôle null.

54voto

Stefan Steinegger Points 37073

Marc Gravell à ajouter à la bonne réponse.

Vous pourriez obtenir un avertissement du compilateur s’il est évident que le cet argument a la valeur null :

Fonctionne bien lors de l’exécution, mais génère l’avertissement `` .

33voto

Jordão Points 29221

Comme vous l'avez déjà découvert, depuis les méthodes d'extension sont tout simplement glorifié méthodes statiques, ils seront appelés null références passées, sans NullReferenceException d'être jeté. Mais, depuis, ils ressemblent à des méthodes d'instance à l'appelant, ils doivent aussi se comporter comme tel. Vous devriez alors, la plupart du temps, vérifier l' this paramètre et renvoie une exception si c'est null. C'est OK de ne pas le faire si la méthode explicitement prend soin de null des valeurs et des son nom l'indique, dûment, comme dans les exemples ci-dessous:

public static class StringNullExtensions { 
  public static bool IsNullOrEmpty(this string s) { 
    return string.IsNullOrEmpty(s); 
  } 
  public static bool IsNullOrBlank(this string s) { 
    return s == null || s.Trim().Length == 0; 
  } 
}

J'ai également écrit un billet de blog à propos de ce il y a quelques temps.

22voto

Binary Worrier Points 27424

Une valeur null sera être passée à la méthode d’extension.

Si la méthode essaie l’objet sans vérifier l’accès est-il null, alors oui, il lèvera une exception.

Un gars a écrit « IsNull » et « IsNotNull » méthodes d’extension qui vérifient la référence passe nulle ou non. Personnellement, je pense que c’est une aberration et ne devrait pas avoir vu la lumière du jour, mais il est parfaitement valide c#.

3voto

Fredrik Leijon Points 2523

L’extensionmethod est statique, donc si vous n’avez pas à quoi que ce soit à cet MyObject il ne devrait pas être un problème, un test rapide devrait le vérifier  :)

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