Je me demandais quelle était la syntaxe la plus propre et la plus compréhensible pour effectuer des contrôles de condition sur des booléens nullables.
Le style de codage suivant est-il bon ou mauvais? Y a-t-il un moyen d'exprimer la condition mieux/plus proprement?
bool? nullableBool = true;
if (nullableBool ?? false) { ... }
else { ... }
en particulier la if (nullableBool ?? false) partie. Je n'aime pas le style if (x.HasValue && x.Value)
...
(ne sais pas si la question a été posée auparavant ... impossible de trouver quelque chose de similaire avec la recherche)
Je pense que beaucoup de gens se concentrent sur le fait que cette valeur est annulable, et ne pensent pas à ce qu'ils veulent réellement :)
bool? nullableBool = true;
if (nullableBool == true) { ... } // true
else { ... } // false or null
Ou si vous voulez plus d'options ...
bool? nullableBool = true;
if (nullableBool == true) { ... } // true
else if (nullableBool == false) { ... } // false
else { ... } // null
(nullableBool == true)
ne reviendra jamais vrai si le bool? est nul: P
Pourquoi ne pas utiliser GetValueOrDefault , qui s’explique assez bien et permet d’utiliser ce que vous voulez par défaut:
if (nullableBool.GetValueOrDefault(false)) {
}
Cela ne vous plaît peut-être pas, mais personnellement, je trouve
if (x.HasValue && x.Value)
le plus lisible. Cela indique clairement que vous travaillez avec un type nullable et 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 lit également:
if (x ?? false)
Est-ce aussi clair? Est-il évident que x est un type nullable? Je vous laisse décider.
Si vous voulez traiter un null
comme faux, alors je dirais que la façon la plus succincte de le faire est d'utiliser l'opérateur nul de coalesce (??
), comme vous le décrivez:
if (nullableBool ?? false) { ... }
Utiliser des extensions.
public static class NullableMixin {
public static bool IsTrue(this System.Nullable<bool> val) {
return val == true;
}
public static bool IsFalse(this System.Nullable<bool> val) {
return val == false;
}
public static bool IsNull(this System.Nullable<bool> val) {
return val == null;
}
public static bool IsNotNull(this System.Nullable<bool> val) {
return val.HasValue;
}
}
Nullable<bool> value = null;
if(value.IsTrue()) {
// do something with it
}
Pensez juste à bool? comme ayant 3 valeurs, alors les choses deviennent plus faciles:
if (someNullableBool == true) // only if true
if (someNullableBool == false) // only if false
if (someNullableBool == null) // only if null
Permet de vérifier comment la comparaison avec null est définie:
static void Main()
{
Console.WriteLine($"null != null => {null != null}");
Console.WriteLine($"null == null => {null == null}");
Console.WriteLine($"null != true => {null != true}");
Console.WriteLine($"null == true => {null == true}");
Console.WriteLine($"null != false => {null != false}");
Console.WriteLine($"null == false => {null == false}");
}
et les résultats sont:
null != null => False
null == null => True
null != true => True
null == true => False
null != false => True
null == false => False
Vous pouvez donc utiliser en toute sécurité:
// check if null or false
if (nullable != true) ...
// check if null or true
if (nullable != false) ...
// check if true or false
if (nullable != null) ...
En fait, je pense que (nullableBool ?? false)
Est une option légitime, en particulier 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 par opposition à:array.Select(v => v.nullableBool.HasValue ? v.nullableBool.Value : false)
(from v in array where v.nullableBool.HasValue ? v.nullableBool.Value : false)
Si vous voulez seulement tester true
contre null
/false
, je viens de lire et de lire:
bool? someCondition = null
if (someCondition.Equals(true))
...
Je pense que c'est à vous. Je pense certainement que l'approche .HasValue est plus lisible, en particulier pour les développeurs qui ne sont pas familiers avec le ?? syntaxe.
L'autre point d'un type booléen nullable est qu'il s'agit de trois états. Vous souhaiterez peut-être faire autre chose s'il est null, et non par défaut à false.
Donné enum
public enum PublishMode { Edit, View }
tu peux le faire comme ici
void MyMethod(PublishMode? mode)
{
var publishMode = mode ?? PublishMode.Edit;
//or
if (mode?? PublishMode.Edit == someValue)
....
}
Si vous ne pouvez pas contrôler si une partie de la condition vérifie une valeur nullable, vous pouvez toujours essayer les solutions suivantes:
if( someInt == 6 && someNullableBool == null ? false : (bool)someNullableBool){
//perform your actions if true
}
Je sais que ce n'est pas exactement une approche puriste qui consiste à mettre un ternaire dans une déclaration if, mais cela résout le problème proprement.
Ceci est, bien sûr, une façon manuelle de dire GetValueOrDefault(false)