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 !
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 !
Pour un switch tu n'as pas besoin de caster, à moins que j'ai mal compris.
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 ^^
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; }
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; }
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.
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.
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
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 :
est tout à fait valide.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Alerts alert = (Alerts) 5;
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.
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.
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; }
Tout a fait !
Merci Stormimonn, merci a tous.
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; }
Bien sur Smiley !
Mais bon je ne t'ai pas encore raconté tout ce que je dois encore faire dans chaque case
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager