En C#, ce qui se passe lorsque vous appelez une méthode d'extension sur un objet null?
La méthode appelée avec une valeur null ou donne-t-il une référence nulle exception?
MyObject myObject = null;
myObject.MyExtensionMethod(); //<-- is this a null reference exception?
Si c'est le cas, j'ai n'auront jamais besoin de vérifier mon " il " paramètre null?
- Sauf, bien sûr, vous avez à traiter avec des ASP.NET MVC qui va lancer cette erreur
Cannot perform runtime binding on a null reference
. - Connexes: ArgumentNullException ou NullReferenceException à partir de la méthode d'extension?
Vous devez vous connecter pour publier un commentaire.
Qui fonctionne très bien (pas d'exception). Les méthodes d'Extension n'utilisez pas les appels virtuels (c'est à dire qu'il utilise la fonction "appel" instruction il, de ne pas "callvirt"), donc il n'est pas null vérifier, à moins que vous écrivez vous-même dans la méthode d'extension. C'est en fait utile dans quelques cas:
etc
Fondamentalement, les appels pour les appels statiques sont très littérale - c'est à dire
devient:
où il n'est évidemment pas null vérifier.
Plus de la réponse correcte de la part de Marc Gravel.
Vous pourriez recevoir un avertissement du compilateur si il est évident que cet argument est null:
Fonctionne bien lors de l'exécution, mais elle produit l'avertissement
"Expression will always cause a System.NullReferenceException, because the default value of string is null"
.Expression<Func<string>> e = () => default(Person).ToString());
vous obtenez le message d'avertissement, à l'exception de son pas un problème si l'expression de l'arbre n'est pas compilé (mais seulement analysées). Ces deux existent dans de VS 2012 compilateur.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, sansNullReferenceException
être jeté. Mais, depuis, ils ressemblent à des méthodes d'instance à l'appelant, ils devraient également se comporter en tant que tel. Vous devriez alors, la plupart du temps, vérifier lathis
paramètre et renvoie une exception si c'estnull
. C'est OK de ne pas le faire si la méthode explicitement prend soin denull
des valeurs et des son nom l'indique, dûment, comme dans les exemples ci-dessous:J'ai également écrit un post de blog sur ce il y a quelques temps.
Null sera transmis à la méthode d'extension.
Si la méthode tente d'accéder à l'objet sans vérification est nulle, alors oui, il va lever une exception.
Un gars ici qui a écrit "IsNull" et "IsNotNull" extension de méthodes qui permettent de vérifier de référence est le passé null ou pas. Personnellement, je pense que c'est une aberration et ne devrait pas avoir vu la lumière du jour, mais il est parfaitement valide en c#.
Foo
est un type de classe,Foo.Something()
inconditionnel être considérée comme une opération sur l'objet auquelFoo
contient une référence, ou si elle peut être une opération surFoo
lui-même. C'est dommage que le C# n'a pas séparé->
et.
opérateurs tels que le C n'a, depuis, ce qui aurait permis que les choses seront plus claires.Comme d'autres l'ont souligné, en appelant une méthode d'extension sur la référence null causes de la cet argument est nul et rien d'autre de spécial va se passer. Cela génère une idée pour utiliser des méthodes d'extension pour écrire garde clauses.
Vous pouvez lire cet article pour exemples: Comment Réduire la Complexité Cyclomatique: la Garde de la Clause version Courte est: est-ce
C'est la classe string de la méthode d'extension qui peut être appelé null référence:
L'appel fonctionne très bien seulement à cause runtime réussir un appel à la méthode d'extension sur la référence null. Ensuite, vous pouvez utiliser cette méthode d'extension pour mettre en œuvre la garde des clauses sans désordre syntaxe:
La extensionmethod est statique, donc si vous n'avez pas à quoi que ce soit de la ce MyObject il ne devrait pas être un problème, un test rapide doit vérifier 🙂
Il y a quelques règles d'or quand vous voulez dans votre être lisible et verticale.
Dans votre cas
- DesignByContract est brisée ... vous allez effectuer une certaine logique sur une instance null.