2009-07-25 25 views
47

J'utilise le type "bool" pour les variables comme je l'étais en C++, et j'essaie de mettre dans ma variable les valeurs des fonctions ou des propriétés que j'attends d'être booléen. Cependant, je rencontre souvent des cas où le type de résultat est "bool?" et non "bool" et le casting implicite échoue.Quelle est la différence entre "bool" et "bool?"

Quelle est la différence entre les deux et quand est-ce que chacun est utilisé? Aussi, devrais-je utiliser "bool?" comme le type pour ma variable? Est-ce la meilleure pratique?

+0

duplication possible de [Que fait "DateTime?" signifie en C#?] (http://stackoverflow.com/questions/109859/what-does-datetime-mean-in-c) – nawfal

Répondre

79

Le symbole ? après un type est seulement un raccourci vers le Nullable type, bool? est équivalent à Nullable<bool>.

bool est un value type, cela signifie qu'il ne peut pas être null, de sorte que le type Nullable permet essentiellement de envelopper les types de valeurs, et d'être en mesure d'attribuer null à leur disposition.

bool? peut contenir trois valeurs différentes: true, false et null.

En outre, il n'y a pas de court-circuit opérateurs (& & ||) pour définies bool?

Seule la logique ET, OU inclusif, les opérateurs sont définis et ils se comportent comme ceci:

x  y  x & y x | y 
true true true true 
true false false true 
true null null true 
false true false true 
false false false false 
false null false null 
null true null true 
null false false null 
null null null null 

Le type nullable est fondamentalement une structure générique, qui a les propriétés publiques suivantes:

public struct Nullable<T> where T: struct 
{ 
    public bool HasValue { get; } 
    public T Value { get; } 
} 

La propriété HasValue indique si l'objet actuel a une valeur, et la propriété Value obtiendra la valeur actuelle de l'objet, ou si HasValue est false, il lancera une exception InvalidOperationException.

Maintenant, vous devez vous demander quelque chose, Nullable est une struct, un type de valeur qui ne peut pas être nul, alors pourquoi l'instruction suivante est valide?

int? a = null; 

Cet exemple va compiler dans celle-ci:

.locals init (valuetype [mscorlib]System.Nullable`1<int32> V_0) 
IL_0000: ldloca.s V_0 
IL_0002: initobj valuetype [mscorlib]System.Nullable`1<int32> 

Un appel à initobj, qui initialise chaque champ du type de valeur à une adresse spécifiée à une référence nulle ou un 0 sur le type primitif approprié .

Voilà, ce qui se passe ici est le struct initialization par défaut.

int? a = null; 

équivaut à:

Nullable<int> a = new Nullable<int>(); 
+2

C'est une bonne réponse, mais puis-je vous suggérer de préciser que bool? est aussi un type de valeur, c'est en fait une structure qui contient quelque chose comme {T value; bool _hasValue} – AnthonyWJones

+0

Merci Anthony, j'ai prolongé un peu mon article. – CMS

+0

Et '! ((Bool?) Null)' donne 'null'. –

14

bool? est annulable en bool est pas.

bool? first; 
bool second; 

Dans le code ci-dessus, first seront null tout second sera false.

Une utilisation typique est si vous voulez savoir si une assignation a été faite à la variable. Depuis bool est un type de valeur (comme int, long, double, DateTime et d'autres types), il sera toujours initialisé à une valeur par défaut (false dans le cas d'un bool, 0 dans le cas d'un int) . Cela signifie que vous ne pouvez pas facilement savoir si c'est false parce que du code lui a été affecté false, ou s'il s'agit de false car il n'a pas encore été affecté. Dans ce cas, bool? est pratique.

+7

Notez que ces valeurs par défaut ne sont valides que pour les variables d'instance/statiques, et non pour les variables locales. –

5

À chaque fois que vous voyez le? caractère suivant un nom de type, il est un raccourci pour Nullable<TypeName>. Nullable est un type spécial qui permet aux types de valeur d'agir comme une valeur nulle. C'est une façon d'exprimer explicitement un type de valeur qui peut avoir une valeur sans valeur.

Pour bool il se efficacement la variable en une valeur trois états

  • Avec Valeur: True
  • Avec Valeur: Faux
  • Sans valeur
2

bool ne peut contenir que true et false valeurs tandis que bool? peut également avoir une valeur null.

3

bool? signifie que le booléen est nullable et est le sucre syntaxique pour une structure Nullable<bool>. Parce qu'un booléen est un type de valeur, vous ne pouvez pas le définir sur null, mais il y a des cas où vous voudriez dans une classe d'accès aux données car les champs de base de données peuvent avoir des valeurs nulles.

4

L'ajout de ? rend le type nullable. Ce qui signifie que vous pouvez le faire:

bool? x = null; 

Et ce serait totalement OK.

0

bool signifie que vous pouvez avoir des valeurs vrai et faux. bool? signifie que vous pouvez avoir une valeur de true, false et null.

Fonctionne pour datetime et les booléens.

1

Un autre bon endroit pour utiliser bool? est dans une méthode pour ajouter une vérification nulle

public bool? IsTurkeyStillInFridge(Turkey turkey) 
{ 
    if (turkey == null) 
    return null; 
    else if (fridge.Contains(turkey)) 
    return true; 
    else 
    return false; 
} 

bool? canStayAtDesk = IsTurkeyStillInFridge(turkey); 

if (canStayAtDesk == null) 
    MessageBox.Show("No turkey this year, check for ham."); 
else if (canStayAtDesk == true) 
    MessageBox.Show("Turkey for lunch. Stay at desk."); 
else 
    MessageBox.Show("Turkey's gone, go out to lunch."); 
Questions connexes