Je me demandais quelle était la syntaxe la plus claire et la plus compréhensible pour faire des vérifications de condition sur les bools nullables.
Le style de codage suivant est-il bon ou mauvais? Existe-t-il un moyen d'exprimer la condition mieux / plus proprement?
bool? nullableBool = true;
if (nullableBool ?? false) { ... }
else { ... }
en particulier la partie if (nullableBool ?? false) . Je n'aime pas le if (x.HasValue && x.Value)
style ...
(Je ne sais pas si la question a déjà été posée ... je n'ai pas trouvé quelque chose de similaire avec la recherche)
c#
coding-style
nullable
FireSnake
la source
la source
Que diriez-vous d'utiliser GetValueOrDefault , qui est assez explicite et permet d'utiliser la valeur par défaut que vous souhaitez:
la source
System.NotSupportedException: LINQ to Entities does not recognize the method 'Boolean GetValueOrDefault()' method, and this method cannot be translated into a store expression.
Vous ne l'aimez peut-être pas, mais personnellement, je trouve
le plus lisible. Il indique clairement que vous travaillez avec un type nullable et il est clair que vous vérifiez d'abord si le type nullable a une valeur avant d'agir de manière conditionnelle.
Si vous prenez votre version et remplacez la variable par x, elle indique également:
Est-ce aussi clair? Est-il évident que x est un type nullable? Je vous laisse décider.
la source
x
est bien dans son contexte et est parfois plus propre; à savoir:var openOrders = orders.Where(x=>x.Open ?? false)
Si vous voulez traiter un
null
comme faux, je dirais que la façon la plus succincte de le faire est d'utiliser l'opérateur de coalescence nulle (??
), comme vous le décrivez:la source
Pensez juste à bool? comme ayant 3 valeurs, alors les choses deviennent plus faciles:
la source
Utilisez des extensions.
la source
null
commetrue
?Permet de vérifier comment la comparaison avec null est définie:
et les résultats sont:
Vous pouvez donc utiliser en toute sécurité:
la source
if(nullable)...else if(!nulllable)...else..
En fait, je pense que
(nullableBool ?? false)
c'est une option légitime, surtout lorsque vous essayez d'évaluer un bool nullable dans linq.Par exemple:
array.Select(v => v.nullableBool ?? false)
(from v in array where v.nullableBool ?? false)
Est plus propre à mon avis que:
array.Select(v => v.nullableBool.HasValue ? v.nullableBool.Value : false)
(from v in array where v.nullableBool.HasValue ? v.nullableBool.Value : false)
la source
Si vous voulez seulement tester pour
true
contrenull
/false
, celui que je viens d'utiliser et qui lit assez bien estla source
Je pense que ça dépend de vous. Je pense certainement que l'approche .HasValue est plus lisible, en particulier avec les développeurs qui ne connaissent pas ?? syntaxe.
L'autre point d'un type booléen nullable est qu'il est tristate, donc vous voudrez peut-être faire quelque chose d'autre quand il est juste null, et non par défaut false.
la source
Étant donné l'énumération
vous pouvez le faire comme ici
la source
nullable boolean
.Si vous êtes dans une situation où vous ne contrôlez pas si une partie de la condition vérifie une valeur annulable, vous pouvez toujours essayer ce qui suit:
Je sais que ce n'est pas exactement une approche puriste mettant un ternaire dans une déclaration if, mais cela résout le problème proprement.
C'est, bien sûr, une façon manuelle de dire
GetValueOrDefault(false)
la source