Bonjour,
Vous pouvez poster dans cette discussion vos commentaires concernant l'article Introduction aux énumérations en C#.
Merci à tous.
Version imprimable
Bonjour,
Vous pouvez poster dans cette discussion vos commentaires concernant l'article Introduction aux énumérations en C#.
Merci à tous.
Article complet, j'ajouterai deux petits éléments :
Le cast direct
Code:
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...
J'avoue, je ne savais pas qu'on pouvait faire un cast dans ce sens là aussi.:aie:
Je vais le rajouter.
Par contre DescriptionAttribute est un peu hors contexte. Peut-être pour un prochain article sur les attributs.
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.
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 :
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:
1
2
3
4
5
6 public enum ConnectionResult { ConnectionOK, WrongLogin, WrongPassword }
Or, il serait beaucoup plus simple de faire la même chose en une ligne :Code:
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é.");
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.Code:Console.WriteLine(connectionResult.ToString());
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.
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.Citation:
Envoyé par Skalp
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 :aie:).
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).
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.
On peut utiliser DescriptionAttribute pour associer une chaine à une valeur d'enum :
Ensuite on peut récupérer la valeur de l'attribut avec une méthode d'extension de ce genre :Code:
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 }
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").Code:
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; }
J'avais déjà signalé ça ya un mois :mouarf:
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...