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 :

Cast des enum en int


Sujet :

C#

  1. #1
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut Cast des enum en int
    Bonjour

    C'est un problème sans doute idiot, mais je ne comprends pas pourquoi je suis systématiquement forcé de caster mes enum en int alors que le type est de l' int ?

    Meme dans un switch case !

    Je trouve ca fastidieux et inutile !

  2. #2
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Pour un switch tu n'as pas besoin de caster, à moins que j'ai mal compris.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    MonEnum truc;
    ...
    switch(truc)
    {
        case MonEnum.Toto:
            break;
        case MonEnum.Tata:
            break;
        case MonEnum.Titi:
            break;
        default:
            break;
    }
    Pour les cas où tu dois manipuler l'enum comme un entier tu n'as pas le choix par contre. C'est ça d'utiliser un typage fort, mais c'est drôlement bien pratique ^^

  3. #3
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut Stormimon

    Pour le switch, c'est peut etre moi qui ai pas bien compris la bonne maniere d'utiliser l'enum

    Je declare un Enum

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       enum Alerts
        {
          V_ON=71,
          V_OFF=72,
          S_SHUTDOWN=73,
          VIOLATION=75,
          MOTION=76
        }

    Et dans un switch utilisant un int je teste les valeurs de l'enum
    Et je suis obligé de caster !


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
           switch (l.type)
            {
              case (int) Alerts.V_ON:
                lAlarm.Add(l);
                break;
              case (int)Alerts.VIOLATION:
                lAlarm.Add(l);
                break;
              case (int)Alerts.MOTION:
                lAlarm.Add(l);
                break;
              case (int)Alerts.S_SHUTDOWN:
                lAlarm.Add(l);
                break;
              default:
                break;
            }

  4. #4
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Points : 1 271
    Points
    1 271
    Par défaut
    Citation Envoyé par olibara Voir le message
    Et dans un switch utilisant un int je teste les valeurs de l'enum
    Et je suis obligé de caster !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
           switch (l.type)
    {
              case (int) Alerts.V_ON:
                lAlarm.Add(l);
                break;
              case (int)Alerts.VIOLATION:
                lAlarm.Add(l);
                break;
              case (int)Alerts.MOTION:
                lAlarm.Add(l);
                break;
              case (int)Alerts.S_SHUTDOWN:
                lAlarm.Add(l);
                break;
              default:
                break;
            }
    Ca me semble assez inefficient, dans la mesure où ça risque de faire un cast par comparaison...

    Même si ce point serait à vérifier en regardant le code IL, il me semblerait plus naturel de transformer l.type en une valeur de l'enum avant de faire le switch sans cast.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if (!Enum.IsDefined(typeof(Alerts), l.type)
    {
      throw new NotSupportedException("...");
    }
    Alerts alert = (Alerts) l.type
    // ou
    L'avantage de l'enum par rapport à l'int c'est que la plage de valeurs possibles est fixée et donc vérifiable à la compilation, au moins tant que tu utilises bien les valeurs de l'enum dans ton code (i.e. Alerts.XXX), et que tu n'assignes pas directement des valeurs numériques qui pourraient se trouver en dehors des valeurs possibles de l'enum. Par ailleurs la classe Enum fournit un ensemble de méthodes permettant de récupérer les valeurs possibles, de vérifier la validité d'une valeur, etc.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par olibara Voir le message
    Pour le switch, c'est peut etre moi qui ai pas bien compris la bonne maniere d'utiliser l'enum
    Je pense aussi... pourquoi tu ne déclares pas type comme étant de type Alerts ? Contrairement aux enums de C++, ceux de C# sont fortement typés, autant en profiter

  6. #6
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Points : 1 271
    Points
    1 271
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Contrairement aux enums de C++, ceux de C# sont fortement typés, autant en profiter
    Attention tout de même à la notion de "fortement typé" : il est tout à fait possible de positionner une valeurs n'appartenant pas à l'enum dans une instance de cet enum :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Alerts alert = (Alerts) 5;
    est tout à fait valide.
    D'ailleurs une instance d'Alerts non initialisée à une autre valeur aura pour valeur numérique 0, qui, n'appartenant pas à l'enum, ne correspond à aucune valeur attendue.

    Très intéressant donc, mais à condition d'en appréhender les limites.

  7. #7
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Et bien voila un bon débat et eclaire ma lanterne et améliore ma connaissance de l'enum en Charp

    Je n'ai jamais eté tres pratiquant des enums mais c'est vrai qu'avec un peu de pratique c'est fort utile.

    Merci a tous.

  8. #8
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Histoire de finir avec les switch et pour en revenir à ton exemple de départ, cela donnerait donc ceci au final
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    switch ((Alerts)l.type)
    {
        case Alerts.V_ON:
            lAlarm.Add(l);
            break;
        case Alerts.VIOLATION:
            lAlarm.Add(l);
            break;
        case Alerts.MOTION:
            lAlarm.Add(l);
            break;
        case Alerts.S_SHUTDOWN:
            lAlarm.Add(l);
            break;
        default:
            break;
    }

  9. #9
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Tout a fait !

    Merci Stormimonn, merci a tous.

  10. #10
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Citation Envoyé par StormimOn Voir le message
    Histoire de finir avec les switch et pour en revenir à ton exemple de départ, cela donnerait donc ceci au final
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    switch ((Alerts)l.type)
    {
        case Alerts.V_ON:
            lAlarm.Add(l);
            break;
        case Alerts.VIOLATION:
            lAlarm.Add(l);
            break;
        case Alerts.MOTION:
            lAlarm.Add(l);
            break;
        case Alerts.S_SHUTDOWN:
            lAlarm.Add(l);
            break;
        default:
            break;
    }
    Juste en passant, le code si dessous est équivalent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    switch ((Alerts)l.type)
    {
        case Alerts.V_ON:
        case Alerts.VIOLATION:
        case Alerts.MOTION:
        case Alerts.S_SHUTDOWN:
            lAlarm.Add(l);
            break;
        default:
            break;
    }

  11. #11
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Bien sur Smiley !


    Mais bon je ne t'ai pas encore raconté tout ce que je dois encore faire dans chaque case

  12. #12
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Citation Envoyé par olibara Voir le message
    Bien sur Smiley !
    Smyley

    Citation Envoyé par olibara Voir le message
    Mais bon je ne t'ai pas encore raconté tout ce que je dois encore faire dans chaque case
    Bah ça, jpouvais pas savoir

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

Discussions similaires

  1. des enum sécurisés et propres
    Par JMLLB dans le forum Langage
    Réponses: 13
    Dernier message: 14/12/2006, 12h25
  2. [question] cast de long vers int
    Par Faiche dans le forum Langage
    Réponses: 3
    Dernier message: 29/11/2006, 10h22
  3. Cast de char vers int
    Par Bernardtapis dans le forum C
    Réponses: 15
    Dernier message: 28/07/2006, 16h58
  4. Probleme de cast de string en int
    Par Oberown dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/04/2006, 11h48
  5. cast de double en int
    Par ensisoft dans le forum C++
    Réponses: 7
    Dernier message: 13/12/2005, 12h23

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