IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Signification du '?' dans "short?" par exemple


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Janvier 2005
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 534
    Par défaut Signification du '?' dans "short?" par exemple
    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 ?

  2. #2
    Membre émérite Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    617
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 617
    Par défaut
    Si je ne me goure pas, cela veut dire que la valeur peut être null
    Ca, ça marche :
    Ca, ça marche pas

  3. #3
    Membre confirmé Avatar de obitskater
    Profil pro
    Développeur .NET
    Inscrit en
    Février 2008
    Messages
    163
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2008
    Messages : 163
    Par défaut
    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à

  4. #4
    Membre émérite Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    617
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 617
    Par défaut
    Et PAF !!
    Ca c'est de l'explication en or !!

  5. #5
    Membre Expert
    Avatar de Pongten
    Homme Profil pro
    IT Analyst & Software Developer
    Inscrit en
    Juin 2002
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Analyst & Software Developer
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 173
    Par défaut
    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 :

    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
    A la ligne 3, on a donc bien le contenu de la variable b qui est affecté à la variable a.

    Par contre, avec un type référence :

    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.
    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.

    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 :

    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
    }
    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
     
     
    int? i = null;
    int j = 2;
     
    i = j;
    la réciproque n'est pas valable. Ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    j = i; //Provoque une erreur de compilation
    il faut alors écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    if(i.HasValue)
    {
     j = i.Value;
    }
    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 !!!

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par Pongten Voir le message
    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 !!!
    En quoi le type string se comporte-t-il comme un type valeur ?

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo