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 :

[Article] Introduction aux énumérations en C#


Sujet :

C#

  1. #1
    Membre confirmé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Points : 598
    Points
    598
    Par défaut [Article] Introduction aux énumérations en C#
    Bonjour,

    Vous pouvez poster dans cette discussion vos commentaires concernant l'article Introduction aux énumérations en C#.

    Merci à tous.

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Article complet, j'ajouterai deux petits éléments :

    Le cast direct
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int jour = 3;
    FrenchDayOfWeek today = (FrenchDayOfWeek)jour; //Plus simple qu'un parse, utile quand les valeurs sont clairement maintenus (bdd avec stockage en byte)

    Ainsi que la récupération de description (DescriptionAttribute), à l'aide d'une méthode d'extension (ref Dvp.net : http://dvp-net.developpez.com/doc/ht...Extensions.htm), ce deuxième point est utile pour montrer des enums plus parlant...

  3. #3
    Membre confirmé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Points : 598
    Points
    598
    Par défaut
    J'avoue, je ne savais pas qu'on pouvait faire un cast dans ce sens là aussi.

    Je vais le rajouter.

    Par contre DescriptionAttribute est un peu hors contexte. Peut-être pour un prochain article sur les attributs.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 657
    Points : 1 240
    Points
    1 240
    Par défaut
    merci.
    peut on associer un string à un enum plutot qu'un int ?
    c'est la seule chose que je trouve bizarre avec les énums de csharp , bien sur je peux utiliser des dictionnaires mais un énum de n'importe que type aurait pu être pas mal.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par camus3 Voir le message
    merci.
    peut on associer un string à un enum plutot qu'un int ?
    ça était fait comme ça le type de base des types enum est un entier et même pas un double.

    Je ne vois pas l’intérêt d'associer un string à un enum, si t'as déjà la méthode ToString() qui te renvoie le nom de l'enum.

  6. #6
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Citation Envoyé par h2s84 Voir le message
    Je ne vois pas l’intérêt d'associer un string à un enum, si t'as déjà la méthode ToString() qui te renvoie le nom de l'enum.
    Associer une chaîne de caractères à une valeur d'enum présente clairement un intérêt.
    Je prends un exemple de l'article :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public enum ConnectionResult
    {
        ConnectionOK,
        WrongLogin,
        WrongPassword
    }
    Dans le morceau de code suivant, le développeur est obligé d'énumérer toutes les valeurs d'enum pour y associer un message :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            ConnectionResult connectionResult = UserCanConnect("foo", "bar");
            if (connectionResult == ConnectionResult.ConnectionOK)
                Console.WriteLine("Connexion réussie !");
            else if (connectionResult == ConnectionResult.WrongLogin)
                Console.WriteLine("Connexion refusée : login inconnu.");
            else if (connectionResult == ConnectionResult.WrongPassword)
                Console.WriteLine("Connexion refusée : mot de passe erroné.");
    Or, il serait beaucoup plus simple de faire la même chose en une ligne :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    Console.WriteLine(connectionResult.ToString());
    Mais la méthode ToString() ne renvoie que le nom de l'enum (à savoir "ConnectionOK", "WrongLogin" ou "WrongPassword"), ce qui n'est pas très explicite pour un utilisateur final.
    Il faut donc en passer par là et selon moi, c'est clairement un manque de C#, car en Java, il est possible d'ajouter des méthodes dans des énumérations.

  7. #7
    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
    Citation Envoyé par Skalp
    Associer une chaîne de caractères à une valeur d'enum présente clairement un intérêt
    ...
    le développeur est obligé d'énumérer toutes les valeurs d'enum pour y associer un message
    Pour ce qui est de l'affichage de message cela va plus loin. Si l'application doit être localisée il y a une "couche" en plus et pour moi ce n'est pas le but d'une énumération que de gérer cette partie. Surtout que toutes n'auront pas vocation à être affichées.

    Une énumération c'est juste une constante nommée, ni plus ni moins. A la limite le type de base d'une enum aurait toujours été Int32 que cela ne changerait pas grand chose (sauf si de grands fous ont eu besoin d'une enum en Int64 avec gestion de champs de bits ).

    Après pour l'association d'un texte à une valeur d'énumération cela doit être géré autrement, avec par exemple des attributs sur les valeurs de l'énumération qui permettront d'associer un texte (soit en dur soit en attaquant un fichier de ressource si on gère la localisation).
    Pas de questions techniques par MP

  8. #8
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Citation Envoyé par StormimOn Voir le message
    Après pour l'association d'un texte à une valeur d'énumération cela doit être géré autrement, avec par exemple des attributs sur les valeurs de l'énumération qui permettront d'associer un texte (soit en dur soit en attaquant un fichier de ressource si on gère la localisation).
    Oui, l'utilisation d'attributs me semble plus adapté dans ce cas.
    Je voulais montrer l'intérêt d'associer une chaîne de caractères à une valeur d'enum.

  9. #9
    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
    Citation Envoyé par Skalp Voir le message
    Je voulais montrer l'intérêt d'associer une chaîne de caractères à une valeur d'enum.
    Je suis entièrement d'accord, cet intérêt n'est même pas discutable. Qui n'a jamais eu besoin un jour de convertir une valeur d'énumération en texte pour l'affichage dans une ComboBox ^^

    En WPF je passe par des attributs, un Converter et un peu de réflexion pour gérer la conversion d'une valeur d'énumération en texte, avec gestion de contexte si jamais je peux avoir un affichage différent suivant les cas.
    Pas de questions techniques par MP

  10. #10
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Citation Envoyé par StormimOn Voir le message
    A la limite le type de base d'une enum aurait toujours été Int32 que cela ne changerait pas grand chose (sauf si de grands fous ont eu besoin d'une enum en Int64 avec gestion de champs de bits ).
    Pour bien des enums, un byte suffit
    (Ok je chipote )

  11. #11
    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 : 42
    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 749
    Points
    39 749
    Par défaut
    On peut utiliser DescriptionAttribute pour associer une chaine à une valeur d'enum :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public enum ConnectionResult
    {
        [Description("Connection réussie")]
        ConnectionOK,
        [Description("Login incorrect")]
        WrongLogin,
        [Description("Password incorrect")]
        WrongPassword
    }
    Ensuite on peut récupérer la valeur de l'attribut avec une méthode d'extension de ce genre :

    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
    18
    19
    20
        public static string GetDescription(this Enum value)
        {
            Type type = value.GetType();
            string name = Enum.GetName(type, value);
            if (name != null)
            {
                FieldInfo field = type.GetField(name);
                if (field != null)
                {
                    DescriptionAttribute attr = 
                           Attribute.GetCustomAttribute(field, 
                             typeof(DescriptionAttribute)) as DescriptionAttribute;
                    if (attr != null)
                    {
                        return attr.Description;
                    }
                }
            }
            return null;
        }
    Evidemment ça ne gère pas la localisation... En pratique j'utilise des ressources .resx : une ressource chaine pour chaque valeur d'enum, avec un nom prévisible ("NomDuTypeEnum_NomValeur").

  12. #12
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    J'avais déjà signalé ça ya un mois

    De plus, comme marqué dans l'article, on a Enum.Parse... Et donc manipuler des String et derrière récupérer la valeur d'un enum...

  13. #13
    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 : 42
    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 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Arnard Voir le message
    J'avais déjà signalé ça ya un mois
    Arf, j'avais pas vu

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