Existe-t-il un attribut simple ou un contrat de données que je peux attribuer à un paramètre de fonction qui empêche null
d'être passé en C # /. NET? Idéalement, cela vérifierait également au moment de la compilation pour s'assurer que le littéral null
n'est utilisé nulle part pour lui et au moment de l'exécution ArgumentNullException
.
Actuellement, j'écris quelque chose comme ...
if (null == arg)
throw new ArgumentNullException("arg");
... pour chaque argument que j'espère ne pas être null
.
Sur la même note, y a-t-il un contraire à celui Nullable<>
par lequel ce qui suit échouerait:
NonNullable<string> s = null; // throw some kind of exception
c#
.net
parameters
null
Neil C. Obremski
la source
la source
Réponses:
Il n'y a malheureusement rien de disponible au moment de la compilation.
J'ai un peu une solution hacky que j'ai publiée sur mon blog récemment, qui utilise une nouvelle structure et des conversions.
Dans .NET 4.0 avec le truc des contrats de code , la vie sera beaucoup plus agréable. Il serait toujours très agréable d'avoir une syntaxe de langage réelle et un support autour de la non-nullabilité, mais les contrats de code aideront beaucoup.
J'ai également une méthode d'extension dans MiscUtil appelée ThrowIfNull qui le rend un peu plus simple.
Un dernier point - une raison d'utiliser "
if (null == arg)
" au lieu de "if (arg == null)
"? Je trouve ce dernier plus facile à lire, et le problème que le premier résout en C ne s'applique pas à C #.la source
if (null == x)
soit due aux différences de langage naturel. Je crois qu'il s'agit vraiment d'un style obsolète qui se propage simplement à travers des exemples, etc.Je sais que je suis incroyablement en retard pour cette question, mais je pense que la réponse deviendra pertinente à mesure que la dernière itération majeure de C # se rapproche de la sortie, puis est publiée. Dans C # 8.0, un changement majeur se produira, C # supposera que tous les types sont considérés comme non nuls.
Selon Mads Torgersen:
La résolution décrite par Mads est donc:
Un exemple de la fonctionnalité souhaitée:
L'aperçu est disponible pour Visual Studio 2017, version 15.5.4+.
la source
Je sais que c'est une TRÈS vieille question, mais celle-ci manquait ici:
Si vous utilisez ReSharper / Rider, vous pouvez utiliser le cadre annoté .
Edit : Je viens d'avoir un -1 aléatoire pour cette réponse. C'est très bien. Sachez simplement qu'elle est toujours valide, même si ce n'est plus l'approche recommandée pour les projets C # 8.0 + (pour comprendre pourquoi, voir la réponse de Greg ).
la source
Découvrez les validateurs dans la bibliothèque d'entreprise. Vous pouvez faire quelque chose comme:
Puis dans votre code lorsque vous souhaitez le valider:
la source
pas le plus joli mais:
vous pouvez également faire preuve de plus de créativité dans la méthode ContainsNullParameters:
bien sûr, vous pouvez utiliser un intercepteur ou une réflexion, mais ils sont faciles à suivre / à utiliser avec peu de frais généraux
la source
return (from o in methodParams where o == null).Count() > 0;
Utilisation:return methodParams.Any(o=>o==null);
ce sera beaucoup plus rapide dans les grandes collectionsOk, cette réponse est un peu tardive, mais voici comment je résous le problème:
Utilisez cette méthode d'extension pour pouvoir traiter les chaînes nulles et vides comme la même chose.
Par exemple
Pas idéal je sais car vous devez vous rappeler d'appeler default partout mais c'est une solution.
la source
string.IsNotNullOrEmpty
vraiment autre que le sucre d'avoir ce qui vous tient à cœur sur la gauche. Peut être alimenté dans d'autres fonctions (longueur, concaténation) etc. Marginally mieux.Default()
) en toute sécurité sur un null (model.Day
). Je sais que les méthodes d'extension ne sont pas vérifiées contre null, mais mes yeux ne sont pas conscients et ils ont déjà imaginé le?
dans le code:model?.Day?.Default()
:)