Types énumération (Guide de programmation C#)

Mise à jour : Juillet 2008

Un type énumération (également nommé une énumération ou un enum) offre un moyen efficace pour définir un jeu de constantes intégrales nommées qui peuvent être assignées à une variable. Par exemple, supposons que vous devez définir une variable dont la valeur représente un jour de la semaine. Cette variable ne stockera jamais plus de sept valeurs précises. Pour définir ces valeurs, vous pouvez utiliser un type énumération, déclaré en utilisant le mot clé enum.

enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
enum Months : byte { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec }; 

Par défaut, le type sous-jacent de chaque élément de l'enum est int. Vous pouvez spécifier un autre type numérique intégral en utilisant un deux-points, comme l'illustre l'exemple précédent. Pour obtenir la liste complète des types possibles, consultez enum (Référence C#).

Voici les avantages que représente l'utilisation d'un enum au lieu d'un type numérique :

  • Vous spécifiez clairement pour le code client les valeurs qui sont valides pour la variable.

  • Dans Visual Studio, IntelliSense répertorie les valeurs définies.

Lorsque vous ne spécifiez pas de valeurs pour les éléments dans la liste des énumérateurs, les valeurs sont incrémentées automatiquement de 1. Dans l'exemple précédent, Days.Sunday a une valeur de 0, Days.Monday a une valeur de 1, et ainsi de suite. Lorsque vous créez un objet Days, il aura une valeur par défaut de Days.Sunday (0) si vous ne lui assignez pas de valeur explicitement. Lorsque vous créez un enum, sélectionnez la valeur par défaut la plus logique et donnez-lui la valeur zéro. Tous les enums auront alors cette valeur par défaut si aucune valeur ne leur est explicitement assignée lorsqu'ils sont créés.

Si la variable meetingDay est de type Days, vous pouvez uniquement (sans un cast explicite) lui assigner l'une des valeurs définies par Days. Et si le jour de la réunion change, vous pouvez assigner une nouvelle valeur de Days à meetingDay :

Days meetingDay = Days.Monday;
//...
meetingDay = Days.Friday;
Remarque :

Il est possible d'assigner n'importe quelle valeur entière arbitraire à meetingDay. Par exemple, cette ligne de code ne produit pas d'erreur : meetingDay = (Days) 42. Toutefois, vous ne devez pas procéder ainsi car le système s'attend implicitement à ce qu'une variable enum contienne seulement l'une des valeurs définies par l'enum. Assigner une valeur arbitraire à une variable de type énumération présente un risque élevé d'erreurs.

Vous pouvez assigner n'importe quelle valeur aux éléments de la liste d'énumérateurs d'un type énumération et vous pouvez également utiliser des valeurs calculées :

enum MachineState
{
    PowerOff = 0,
    Running = 5,
    Sleeping = 10,
    Hibernating = Sleeping + 5
}

Types énumération comme bits indicateurs

Vous pouvez utiliser un type énumération pour définir des bits indicateurs, ce qui permet à une instance du type énumération de stocker n'importe quelle combinaison des valeurs définies dans la liste des énumérateurs. (Bien sûr, certaines combinaisons peuvent ne pas être significatives ou autorisées dans votre code de programme.)

Vous créez un enum de bits indicateurs en appliquant l'attribut System.FlagsAttribute et en définissant les valeurs de manière appropriée afin que les opérations au niveau du bit AND, OR, NOT et XOR puissent leur être appliquées. Dans l'enum de bits indicateurs, incluez une constante nommée dont la valeur zéro signifie « aucun indicateur n'est défini ». N'attribuez pas de valeur zéro à un indicateur si elle ne signifie pas « aucun indicateur n'est défini ».

Dans l'exemple suivant, une autre version de l'enum Days, nommée Days2 est définie. Days2 a l'attribut Flags et une puissance de 2, plus élevée, est assignée à chaque valeur. Cela vous permet de créer une variable Days2 dont les valeurs sont Days2.Tuesday et Days2.Thursday.

[Flags]
enum Days2
{
    None = 0x0,
    Sunday = 0x1,
    Monday = 0x2,
    Tuesday = 0x4,
    Wednesday = 0x8,
    Thursday = 0x10,
    Friday = 0x20,
    Saturday = 0x40
}
class MyClass
{
    Days2 meetingDays = Days2.Tuesday | Days2.Thursday;
}

Afin de définir un indicateur pour un enum, utilisez l'opérateur logique OR, comme l'illustre l'exemple suivant :

// Initialize with two flags using bitwise OR.
meetingDays = Days2.Tuesday | Days2.Thursday;

// Set an additional flag using bitwise OR.
meetingDays = meetingDays | Days2.Friday;

Console.WriteLine("Meeting days are {0}", meetingDays);
// Output: Meeting days are Tuesday, Thursday, Friday

// Remove a flag using bitwise XOR.
meetingDays = meetingDays ^ Days2.Tuesday;
Console.WriteLine("Meeting days are {0}", meetingDays);
// Output: Meeting days are Thursday, Friday

Pour déterminer si un indicateur spécifique est défini, utilisez une opération AND logique, comme l'illustre l'exemple suivant :

// Test value of flags using bitwise AND.
bool test = (meetingDays & Days2.Thursday) == Days2.Thursday;
Console.WriteLine("Thursday {0} a meeting day.", test == true ? "is" : "is not");
// Output: Thursday is a meeting day.

Pour plus d'informations sur les éléments à prendre en compte lorsque vous définissez des types énumération avec l'attribut System.FlagsAttribute, consultez System.Enum.

Utilisation des méthodes System.Enum pour découvrir et manipuler des valeurs enum

Tous les enums sont des instances du type System.Enum. Vous ne pouvez pas dériver de nouvelles classes de System.Enum, mais vous pouvez utiliser ses méthodes pour obtenir des informations sur les valeurs d'une instance enum et manipuler ces dernières.

string s = Enum.GetName(typeof(Days), 4);
Console.WriteLine(s);

Console.WriteLine("The values of the Days Enum are:");
foreach (int i in Enum.GetValues(typeof(Days)))
    Console.WriteLine(i);

Console.WriteLine("The names of the Days Enum are:");
foreach (string str in Enum.GetNames(typeof(Days)))
    Console.WriteLine(str);

Pour plus d'informations, consultez System.Enum.

Vous pouvez également créer une méthode pour un enum en utilisant une méthode d'extension. Pour plus d'informations, consultez Comment : créer une méthode pour une énumération (Guide de programmation C#).

Voir aussi

Concepts

Guide de programmation C#

Référence

enum (Référence C#)

System.Enum

Historique des modifications

Date

Historique

Raison

Juillet 2008

Rubrique ajoutée

Résolution des bogues de contenu.