Le meilleur moyen de vérifier les paramètres nuls (Garde Clauses)
Par exemple, habituellement, vous ne voulez pas les paramètres d'un constructeur à être nul, il est donc tout à fait normal de voir quelque chose comme
if (someArg == null)
{
throw new ArgumentNullException(nameof(someArg));
}
if (otherArg == null)
{
throw new ArgumentNullException(nameof(otherArg));
}
Il ne l'encombrement un peu le code.
Est-il un moyen de vérifier l'argument d'une liste d'arguments mieux que cela?
Quelque chose comme "vérifier tous les arguments et jeter un ArgumentNullException si l'un d'eux est nul et qui vous donne les arguments qui ont été nulle.
En passant, concernant la double question de revendications, ce n'est pas sur le marquage des arguments avec des attributs ou quelque chose qui se construit, mais de ce que certains appellent la Garde des Clauses pour assurer qu'un objet reçoit initialisé dépendances.
peut-être les mettre tous dans un tableau d'objets et d'itérer sur eux à l'aide d'une boucle foreach? vous avez besoin de quelque chose comme ça?
Nous avons l'habitude de consulter notre paramètres au début de la méthode comme votre extrait de code. Pas seulement pour les nuls, aussi pour d'autres entreprises de la logique des comportements. Je ne vois pas de problème avec cela aussi longtemps que vous n'avez pas trop de paramètres. Au moins, vous pouvez lire les exigences de votre méthode facilement.
C'est une idée terrible. Vous ne voulez pas faire une méthode qui vise à prendre très particulier, le nombre et le type des objets comme paramètres de prendre un nombre indéterminé d'objets de types inconnus juste pour le plaisir de facilement vérifier si elles sont null. Vous êtes à la résolution d'un problème par la création d'un problème beaucoup plus important.
bien que pourriez-vous faire d'autre pour faire plus court? je viens de donner un exemple
OriginalL'auteur SuperJMN | 2015-03-21
Vous devez vous connecter pour publier un commentaire.
utilisation:
La
DebuggerStepThroughAttribute
est assez pratique, de sorte que dans le cas d'une excpetion pendant le débogage (ou quand j'ai attacher le débogueur après que l'exception s'est produite) je ne vais pas finir à l'intérieur de laArgumentNotNull
méthode, mais plutôt à la méthode d'appel où la référence nullactually
dans les parages.Je suis en utilisant ReSharper Contrat Annotations.
ContractAnnotationAttribute
permet de s'assurer que je n'ai jamais mal orthographiél'argument (
"foo"
) et aussi le renomme automatiquement si je renommele
foo
symbole.NotNullAttribute
aide ReSharper avec l'analyse de code. Donc, si je nenew Constructor(null)
si vous obtenez un avertissement de ReSharper que cela conduira à une exception.vous pouvez également faire la même chose avec externe de fichiers XML que vous pouvez déployer votre bibliothèque et que les utilisateurs peuvent optinally de référence dans leur ReShaprer.
OriginalL'auteur bitbonk
Si vous avez trop de paramètres dans votre constructeur, vous feriez mieux de réviser, mais c'est une autre histoire.
Pour diminuer standard code de validation que beaucoup de gars écriture de la Garde de l'utilitaire de classes comme ceci:
(Vous pouvez ajouter d'autres méthodes de validation qui pourraient être nécessaires pour que la Garde de la classe).
Ainsi, il suffit d'une seule ligne de code pour valider un paramètre:
Vous êtes les bienvenus 🙂
Juste une note mineure, vous pouvez également utiliser la
nameof
opérateur au lieu de codage en dur le nom d'argument, par exempleGuard.ThrowIfNull(obj, nameof(obj))
Aussi, vous demande
argumentName
paramètre, mais ne l'utilisez pas. Jeter déclaration doit être comme suit:throw new ArgumentNullException(argumentName);
Bonne prise! La révision du Code en action 🙂
OriginalL'auteur serge.karalenka
Null références sont un genre de désagréments que vous avez à éviter. Mais, ils ne sont pas le seul. Le problème est plus large que ça, et il se résume à ceci: Méthode accepte les instances d'un certain type, mais il ne peut pas traiter tous les cas.
En d'autres termes, le domaine de la méthode est plus grand que l'ensemble des valeurs qu'il traite. Garde clauses sont ensuite utilisés pour affirmer que le paramètre réel ne tombe pas dans cette "zone grise" de la le domaine de la méthode qui ne peut pas être traitée.
Maintenant, nous avons des références nulles, comme une valeur qui est généralement à l'extérieur de l'ensemble acceptable de valeurs. D'autre part, il arrive souvent que certains non-nulle d'éléments de l'ensemble sont aussi inacceptables (par exemple, une chaîne vide).
Dans ce cas, il peut s'avérer que la signature de la méthode est trop large, ce qui indique alors un problème de conception. Qui peut conduire à une refonte, par exemple, la définition d'un sous-type, généralement un dérivé de l'interface, qui restreint le domaine de la méthode et fait partie de la garde des clauses de disparaître. Vous pouvez trouver un exemple dans cet article: Pourquoi avons-Nous Besoin de la Garde des Clauses?
OriginalL'auteur Zoran Horvat
Il y a un package nuget appelé Swissknife. Installer Swissknife de galerie nuget. Il vous offre de nombreuses options de départ avec null vérification pour les arguments
Argument.IsNotNullOrEmpty(args,"args")
sousSwissknife.Diagnostics.Contracts
espace de noms alongwith avec l'option idoim et beaucoup plus.Vous pouvez définirOption<Class_Name> _someVar
et de vérifier ensuite si_someVar.IsSome or _SomeVar.IsNone
.Cette aide à lutter contre les nullable classes. Espérons que cette aide.OriginalL'auteur Sriman Saswat Suvankar
Vous pouvez essayer le 'Heleonix.La garde de la bibliothèque, qui offre de garde de la fonctionnalité:
https://github.com/Heleonix/Heleonix.Guard/blob/master/README.md
Vous pouvez écrire de la garde des clauses comme ci-dessous:
Il fournit à lancer de nombreuses exceptions, et vous pouvez écrire personnalisée des méthodes d'extension pour personnalisé exceptions. Aussi, la bibliothèque se réfère à la " Heleonix.Les Extensions de la bibliothèque avec prédictive des extensions comme
IsNull
,IsNullOrEmptyOrWhitespace
,IsLessThan
et beaucoup plus de pour vérifier vos arguments ou variables en fonction de valeurs de votre choix. Contrairement à certains autres de la garde des bibliothèques parle couramment interfaces, ces extensions ne génèrent pas des objets intermédiaires, et depuis la mise en œuvre est vraiment simple, ils sont performants.Chaque argument doit séparer les vérifier. I. e. pour le cas en question, il serait comme ci-dessous:
Throw.ArgumentNullException(when: someArg.IsNull(), nameof(someArg)); Throw.ArgumentNullException(when: otherArg.IsNull(), nameof(otherArg));
Si l'évaluation de la première expressionsomeArg.IsNull()
esttrue
, alors, l'exception est levée, la deuxième expressionotherArg.IsNull()
n'est pas évalué etc.Ce que je veux dire, c'est que
nameof(someArg)
est toujours évalué, même sisomeArg.IsNull()
renvoie la valeur false, contrairement à l'if/then. Dans ce cas, c'est probablement correct, mais peut être souhaitable si au lieu d'un simplenameof()
que nous avions quelque chose avec des effets secondaires (y compris la synchronisation des effets).La droite. C'est pourquoi jeter des exceptions devrait être comme une simple ligne simple expression. Si il y en a c'est à dire multi-ligne logique, surtout avec les effets secondaires, il est préférable d'utiliser régulièrement
if
déclaration parce que la logique serait plus lisible (pour moi, je préfère la considérer comme une partie de votre agorithm)OriginalL'auteur Hennadii Lutsyshyn