63 votes

Newbie C #: quelle est la différence entre "bool" et "bool?"

Je commence avec C#, et rencontré quelque chose qui m'intrigue, c'. J'utilise le "bool" type pour les variables comme je l'ai a été utilisée en C++, et j'ai essayer de mettre les valeurs des fonctions ou des propriétés-je m'attendre à être booléenne dans ma variable. Cependant souvent, je rencontre des cas où le résultat est de type "bool?" et pas "bool" et la conversion implicite d'échec.

Au lieu d'aller pour les livres, j'ai décidé de poster ceci sur StackOverflow. Quelqu'un pourrait-il expliquer quelle est la différence entre les deux et quand est-il utilisé? Aussi, dois-je utiliser "bool?" comme type de ma variable? Est-ce la meilleure pratique?

Merci

100voto

CMS Points 315406

L' ? symbole après un type n'est qu'un raccourci vers le type Nullable, bool? est équivalent à Nullable<bool>.

bool est un type de valeur, ce qui signifie qu'il ne peut pas être null, de sorte que le type Nullable fondamentalement vous permet d'emballer types de valeurs, et d'être en mesure d'attribuer null d'entre eux.

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

Aussi, il n'y a pas de court-circuiter les opérateurs (&& ||) définie pour l' bool?

Seule la logique ET, inclusive OU, 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 un générique struct, qui a la suite de propriétés publiques:

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

L' HasValue propriété indique si l'objet a une valeur, et l' Value propriété sera d'obtenir la valeur actuelle de l'objet, ou si HasValue est faux, il va lever une exception InvalidOperationException.

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

int? a = null;

Cet exemple permettra de compiler dans ce:

.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 null ou 0 du type primitif.

C'est ça, ce qui se passe ici est la valeur par défaut de structure de l'initialisation.

int? a = null;

Est équivalent à:

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

18voto

Fredrik Mörk Points 85694

bool? est nullable tout bool ne l'est pas.

bool? first;
bool second;

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

Une utilisation typique est si vous voulez savoir si il y a eu une affectation à la variable. Depuis bool est un type de valeur (comme int, long, double, DateTime et certains 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 certains code attribué false , ou si c'est false parce qu'il n'a pas encore été attribué. Dans ce cas bool? vient dans maniable.

6voto

JaredPar Points 333733

Chaque fois que vous voyez le? caractère suivant un nom de type, c'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 un moyen d'exprimer explicitement un type de valeur qui peut avoir une valeur non-valeur.

Pour bool, il transforme effectivement la variable en une valeur à trois états

  • Avec valeur: True
  • Avec valeur: False
  • Sans valeur

5voto

Lucas Points 13318

Ajouter ? rend le type nul. Ce qui signifie que vous pouvez faire ceci:

 bool? x = null;
 

Et ce serait totalement OK.

3voto

Charlie Points 4976

bool? signifie que le booléen est nul et correspond au sucre syntaxique pour une structure Nullable<bool> . Etant donné qu'un booléen est un type de valeur, vous ne pouvez pas le définir sur null, mais vous voudrez peut-être aimer dans une classe d'accès aux données dans certains cas, car les champs de la base de données peuvent avoir des valeurs NULL.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X