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