Bonjour à tous
Je ne comprends pas le sens du symbole '?' dans le code ci-dessous :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 [DataMember] public short? LeftRightEye { get; set; }
Quelqu'un saurait l'interpréter ?![]()
Bonjour à tous
Je ne comprends pas le sens du symbole '?' dans le code ci-dessous :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 [DataMember] public short? LeftRightEye { get; set; }
Quelqu'un saurait l'interpréter ?![]()
Si je ne me goure pas, cela veut dire que la valeur peut être null
Ca, ça marche :
Ca, ça marche pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 int? i; i = null;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 int i; i = null;
Salut!
En effet Ppphil, c'est bien ça.
Il y a ce qu'on appelle les type nullable, dont les instances peuvent prendre la valeur null (object, string, CustomObject, etc...) et le type non nullable, dont les instances ne peuvent, elles, pas prendre pour valeur null (int, short, bool, DateTime, etc...).
Dans certains cas on a besoin de rendre une variable de type non nullable, en nullable, et pour ce faire on rajoute le "?".
Ainsi on se retrouve dans un contexte "intermédiaire". En effet, toute variable issues de type forcés à nullable (?), présente 2 propriétés:
- HasValue (boolean, indiquant si l'instance contient une valeur ou non->null)
- Value (qui renvoie la valeur stockée dans le type de base non nullable)
Attention, toute fois si on ne teste pas le HasValue avant, et on appelle tout de suite Value, à l'exception qui risque d'être levée si la variable est en effet égale à null.
Voilà![]()
Pour compléter l'explication de obitskater, je rajouterai que la distinction est plutôt au niveau des types valeur et des types référence.
Seules les références peuvent se voire affecter la "valeur" null qui signifie simplement qu'elle ne référence aucune zone mémoire !
En fait, lorsqu'on déclare une variable avec un type valeur, cette variable contient directement la valeur concernée.
Un type référence, par contre, contient une référence vers la zone mémoire qui contient la valeur assignée à la variable.
Deux petits exemples pour illustrer cela :
A la ligne 3, on a donc bien le contenu de la variable b qui est affecté à la variable a.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 int a = 2; int b = 3; a = b; //Maintenant, a contient 3 et b contient 3 également b = 4; //a contient toujours 3 et b contient 4
Par contre, avec un type référence :
Dans ce second exemple, on voit bien que lors d'une affectation d'un variable référence à une autre, c'est bien la référence vers la zone de mémoire contenant les valeurs qui est copiée, et donc que la variable a reçoit la référence vers le contenu de la variable b. a et b pointent donc toutes les deux vers la même zone de mémoire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 class Ex { public int MonChamp = 2; } Ex a = new Ex(); Ex b = new Ex(); //a.MonChamp vaut 2, b.MonChamp vaut 2 a = b; b.MonChamp = 4; //Maintenant, b.MonChamp vaut 4 et a.monChamp vaut 4 également.
Il arrive cependant parfois qu'on ait besoin de pouvoir affecter la "valeur" null à un type valeur.
C'est ce besoin qui a donné naissance au type Nullable<T> et dont le raccourci syntaxique est le ? placé après le type : int?, long?, short?
En fait, ce qui se passe, c'est qu'une structure de type Nullable<T> est créée (ou T est le type précédent le ?). Cette structure offre 2 propriétés, à savoir HasValue et Value comme précisé par obitskater et surcharge différents opérateurs pour permettre d'effectuer une comparaison avec null ou une affectation directe d'une valeur (par exemple : int? x = 4)
Avec cette syntaxe, il devient donc possible d'écrire :
Attention cependant que s'il est possible d'écrire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 int? i = null; if(i != null) { ...code } //equivalent à if(i.HasValue) { ... code }
la réciproque n'est pas valable. Ainsi
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 int? i = null; int j = 2; i = j;
il faut alors écrire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3j = i; //Provoque une erreur de compilation
Petit trouble fête de toute cette histoire, le type string qui est un type référence mais qui se comporte comme un type valeur !!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 if(i.HasValue) { j = i.Value; }
Partager