Valeurs d’énumération non uniques

J’essaie de masquer les positions de l’index sur un fichier edi … J’avais une situation où 2 ou 3 éléments pouvaient être indexés en fonction de la situation. Ce serait cool d’utiliser un enum pour cacher les “nombres magiques” et j’ai été surpris de voir que vous pouviez assigner plusieurs énumérations à la même valeur comme ceci:

public enum Color { Red = 1, Blue = 1, Green = 1 } 

et le compilateur est content de cela. Je ne m’attendais pas à ce que cela fonctionne. Je n’ai pas besoin de revenir à la liste, alors je ne suis pas inquiet d’essayer d’y retourner, mais ça sent génial. Pourquoi le CLR autorise-t-il plusieurs valeurs pour les énumérations et devrais-je utiliser une structure pour cela? (Une structure semblait devoir être plus lourde qu’une enum et cela semble fonctionner)

En fait, vous définissez déjà une structure … En coulisses, une énumération n’est qu’une structure (mais dérivée de System.Enum) et les valeurs de l’énum sont définies comme des constantes (vous pouvez le vérifier avec ILDASM).

Votre définition enum se traduit par le pseudo code C # suivant:

 public struct Color : System.Enum { public const int Red = 1; public const int Blue = 1; public const int Green = 1; } 

Le code ci-dessus ne sera pas compilé en C # car le compilateur ne permet pas de définir une structure avec une classe de base explicite, mais c’est ce qu’il émet pour une définition enum.

Comme il n’y a pas de problème avec un type contenant plusieurs constantes ayant la même valeur, la définition enum ne pose aucun problème.

Mais comme l’énum n’a pas de valeurs uniques, vous pourriez avoir un problème lors de la conversion dans cette énumération. Par exemple, les deux lignes de codes suivantes renverront la valeur enum Red, car la première valeur est sélectionnée arbitrairement.

 Color color1 = (Color)1; Color color2 = (Color)Enum.Parse(typeof(Color), "1"); 

Ssortingctement parlant, la valeur enum n’est pas Red, elle est 1, mais lorsque vous imprimez la valeur, vous verrez Red.

De plus, le booléen suivant est vrai, ce qui semble un peu bizarre …

 // true (Red is Green??) bool b = Color.Red == Color.Green; 

En bout de ligne, c’est parfaitement légal, mais c’est à vous de l’utiliser quand cela a du sens …

Voici un lien direct vers la section de mon tutoriel .NET qui traite des énumérations sous le capot: http://motti.me/c1E

C’est parfaitement légal C #. A partir de la spécification C # Language version 4.0, section 14.3:

Plusieurs membres enum peuvent partager la même valeur associée. L’exemple

 enum Color { Red, Green, Blue, Max = Blue } 

affiche une énumération dans laquelle deux membres enum – Blue et Max – ont la même valeur associée.

La même valeur numérique mais un nom différent n’est rien d’autre qu’un alias. Ce pourrait être par exemple

 public enum Color { DefaultColor = 1, Red = 1, Blue = 2 } 

Cela peut avoir du sens dans certains cas, mais pas beaucoup. Lorsque vous parsingz les valeurs et que vous appelez colorValue.ToSsortingng (), vous obtiendrez la dernière valeur sous forme de valeur (Red dans ce cas), mais vous perdrez le nombre de couleurs par défaut, car c’est la même chose. Au moins dans la manière dont vous avez modélisé vos données. Si vous voulez le garder séparé, utilisez des valeurs différentes pour différentes choses.

Ce serait une définition parfaitement acceptable:

 public enum AllTheThings { TheMoney = 1, TheFreeRides = 1, TheLieThatYouDenied = 2, TheCallsYouveBeenMaking = 3, TheTimesYouveBeenFaking = 4 } 

Si vous considérez chaque valeur en tant que constante, cela a du sens. Il n’y a aucune raison pour que vous ne puissiez pas avoir deux constantes avec la même valeur:

 public enum MyColor { Blue = 2, Yellow = 3, Green = 4 BlueAndYellow = 4, } 

Est le même que:

 public enum MyColor { Blue = 2, Yellow = 3, Green = 4, BlueAndYellow = Green, } 

Essentiellement, vous avez juste la même constante avec deux noms différents. BlueAndYellow est un alias pour Green .

Une chose à noter ici est que les valeurs non uniques entraînent des valeurs manquantes et dupliquées dans Visual Studio Designer.

 public enum MyColor { Red= 1, Green= 1, Blue= 2 } 

Si vous utilisez cette enum dans une propriété que vous pouvez gagner, vous verrez du vert, du vert, du bleu dans le concepteur plutôt que du rouge, du vert et du bleu .