Quelle est la différence entre “bool” et “bool?”?

J’utilise le type “bool” pour les variables auxquelles j’étais habitué en C ++, et j’essaie de mettre les valeurs des fonctions ou des propriétés que je pense être booléennes dans ma variable. Cependant, je rencontre souvent des cas où le type de résultat est “bool?” et pas “bool” et le casting implicite échoue.

Quelle est la différence entre les deux et quand chacun est utilisé? De plus, devrais-je utiliser “bool?” comme type pour ma variable? Est-ce la meilleure pratique?

Le ? symbole après un type n’est qu’un raccourci vers le type Nullable , bool? est équivalent à Nullable .

bool est un type de valeur , cela signifie qu’il ne peut pas être null , donc le type Nullable vous permet fondamentalement d’encapsuler les types de valeur et de pouvoir leur atsortingbuer null .

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

De plus, il n’y a pas d’opérateur de court-circuit (&& ||) défini pour bool?

Seuls les opérateurs logiques ET, OU inclusifs sont définis et se comportent comme suit:

 xyx & yx | 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 essentiellement une structure générique, qui possède les propriétés publiques suivantes:

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

La propriété HasValue indique si l’object actuel a une valeur et que la propriété Value obtiendra la valeur actuelle de l’object, ou si HasValue est faux, une exception InvalidOperationException sera lancée.

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

 int? a = null; 

Cet exemple comstackra dans ceci:

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

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

Voilà, ce qui se passe ici est l’ initialisation de la structure par défaut.

 int? a = null; 

Est équivalent à:

 Nullable a = new Nullable(); 

bool? est nullable alors que bool ne l’est pas.

 bool? first; bool second; 

Dans le code ci-dessus, le first sera null tandis que le second sera false .

Une utilisation typique est si vous voulez savoir si une affectation a été faite à la variable. Puisque bool est un type de valeur (tout comme int , long , double , DateTime et quelques 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 car un code lui a été atsortingbué par false ou s’il est false car il n’a pas encore été atsortingbué. Dans ce cas bool? est très pratique.

A chaque fois que tu vois le? caractère suivant un nom de type, c’est un raccourci pour Nullable . Nullable est un type spécial qui permet aux types de valeur d’agir comme une valeur nulle. C’est une manière d’exprimer explicitement qu’un type de valeur peut avoir une valeur autre que la valeur.

Pour bool, la variable devient une valeur à trois états

  • Avec valeur: vrai
  • Avec valeur: faux
  • Sans valeur

Ajouter ? rend le type null-capable. Ce qui signifie que vous pouvez le faire:

 bool? x = null; 

Et ce serait totalement OK.

bool? signifie que le booléen est nullable et est un sucre syntaxique pour une Nullable . Comme 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 souhaitez aimer une classe d’access aux données car les champs de firebase database peuvent avoir des valeurs nulles.

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

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

 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."); 

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

Cela fonctionne pour datetime et booléens.