2010-04-20 5 views
105

Je me demandais quelle était la syntaxe la plus propre et la plus compréhensible pour effectuer des vérifications de condition sur les booléens Nullable.Meilleure façon de vérifier la présence d'une valeur booléenne nulle dans une expression de condition (si ...)

Le style de codage est-il bon ou mauvais? Existe-t-il un moyen d'exprimer la condition mieux/plus proprement?

bool? nullableBool = true; 
if (nullableBool ?? false) { ... } 
else { ... } 

surtout si (?? nullableBool false) partie. Je n'aime pas le style if (x.HasValue && x.Value) ...

(pas sûr que la question a été posée ... n'a pas pu trouver quelque chose de similaire avec la recherche)

Répondre

216

Je pense que beaucoup de gens se concentrent sur le fait que cette valeur est annulable, et ne pense pas à ce qu'ils veulent vraiment :)

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 nulle: P

+11

Observation rafraîchissante génial! – seebiscuit

+0

Je n'avais pas réalisé que la comparaison NULL était significative comme ceci. Les détails peuvent être trouvés à https://msdn.microsoft.com/en-us/library/2cf62fcy.aspx –

0

Je pense que jusqu'à vous . Je pense certainement que l'approche .HasValue est plus lisible, surtout avec les développeurs qui ne connaissent pas le ?? syntaxe.

L'autre point d'un type booléen Nullable est qu'il est tristate, donc vous pouvez vouloir faire autre chose quand il est juste null, et non par défaut à false.

25

Vous ne pouvez pas l'aimer, mais personnellement je trouve

if (x.HasValue && x.Value) 

le plus lisible. Il indique clairement que vous travaillez avec un type Nullable et indique clairement 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 avec x aussi lit comme suit:

if (x ?? false) 

Est-ce aussi clair? Est-ce évident que x est un type nullable? Je vais te laisser décider.

+0

afaik,? ? ne fonctionne que sur les types Nullable. De plus, la variable doit avoir un nom plus agréable que x :) – FireSnake

+4

Par "type nullable", je voulais dire spécifiquement les types System.Nullable. Tout type de référence peut être nul. En outre, si vous avez besoin d'utiliser le type d'une variable dans le cadre de son nom, cela indique que votre code n'est pas clair. –

+4

Cette réponse est bien meilleure et pratique que la réponse acceptée ... –

16

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 coalesce null (??), que vous décrivez:

if (nullableBool ?? false) { ... } 
8

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 
} 
+0

Votre méthode d'extension 'IsNotNull' est incorrecte. – Oded

+0

Que faire si vous voulez considérer 'null' comme' true'? –

+0

IsTrue() | IsNull() .. :) J'ai reproduit la logique du fonctionnement de SQL avec les valeurs nulles. Je pense que c'est la syntaxe la plus propre et la plus compréhensible. –

44

Comment l'utilisation GetValueOrDefault, ce qui est assez auto-expliquer et permet d'utiliser tous les défaut que vous voulez:

if (nullableBool.GetValueOrDefault(false)) { 
} 
+2

Selon le contexte cette approche pourrait lancer 'System.NotSupportedException: LINQ to Entities ne reconnaît pas la méthode 'Boolean GetValueOrDefault()' méthode, et cette méthode ne peut pas être traduite en une expression de magasin. » –

+1

merci. J'utilise juste GetValueOrDefault() car il est par défaut à false. –

0

Compte tenu ENUM

public enum PublishMode { Edit, View } 

vous pouvez le faire comme ici

void MyMethod(PublishMode? mode) 
    { 
     var publishMode = mode ?? PublishMode.Edit; 

//or 
     if (mode?? PublishMode.Edit == someValue) 
     .... 
    } 
+0

Pas une réponse à la question, qui est spécifiquement sur 'nullable boolean'. – ToolmakerSteve

-1

Si vous êtes dans une situation où vous ne contrôlez si une partie de la condition vérifie une valeur nulle, vous pouvez toujours essayer ce qui suit:

if(someInt == 6 && someNullableBool == null ? false : (bool)someNullableBool){ 
    //perform your actions if true 
} 

Je sais ce n'est pas exactement une approche puriste qui met un ternaire dans une instruction if mais qui résout le problème proprement.

Ceci est, bien sûr, d'une manière manuelle de dire GetValueOrDefault(false)

+1

La solution fournie dans l'OP est la même chose, mais juste avec beaucoup moins de bourrage de code. Ce n'est pas du tout avantageux à cela. – Servy

2

permet de vérifier la façon dont 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 

Alors vous pouvez 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) ... 
3

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 
1

Si vous voulez seulement tester true contre null/false, celui que je viens d'utiliser et lit très bien est

bool? someCondition = null 
if (someCondition.Equals(true)) 
... 
Questions connexes