Types énumération (Guide de programmation C#)Enumeration types (C# Programming Guide)

Un type énumération (également appelé énumération ou enum) offre un moyen efficace de définir un ensemble de constantes intégrales nommées qui peuvent être assignées à une variable.An enumeration type (also named an enumeration or an enum) provides an efficient way to define a set of named integral constants that may be assigned to a variable. Par exemple, supposez que vous devez définir une variable dont la valeur représente un jour de la semaine.For example, assume that you have to define a variable whose value will represent a day of the week. Il n’y a que sept valeurs significatives qui pourront être stockées par cette variable.There are only seven meaningful values which that variable will ever store. Pour définir ces valeurs, vous pouvez utiliser un type énumération, qui est déclaré à l’aide du mot clé enum.To define those values, you can use an enumeration type, which is declared by using the enum keyword.

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

Par défaut, le type sous-jacent de chaque élément dans l’énumération est int. Vous pouvez spécifier un autre type numérique intégral à l’aide d’un signe deux-points, comme illustré dans l’exemple précédent.By default the underlying type of each element in the enum is int. You can specify another integral numeric type by using a colon, as shown in the previous example. Pour obtenir une liste complète des types possibles, consultez enum (référence C#).For a full list of possible types, see enum (C# Reference).

Vous pouvez vérifier les valeurs numériques sous-jacentes en effectuant un cast sur le type sous-jacent, comme le montre l’exemple suivant.You can verify the underlying numeric values by casting to the underlying type, as the following example shows.

Day today = Day.Monday;
int dayNumber =(int)today;
Console.WriteLine("{0} is day number #{1}.", today, dayNumber);

Month thisMonth = Month.Dec;
byte monthNumber = (byte)thisMonth;
Console.WriteLine("{0} is month number #{1}.", thisMonth, monthNumber);

// Output:
// Monday is day number #1.
// Dec is month number #11.

Voici les avantages qu’offre l’utilisation d’un enum par rapport à un type numérique :The following are advantages of using an enum instead of a numeric type:

  • Vous spécifiez clairement pour le code client les valeurs qui sont valides pour la variable.You clearly specify for client code which values are valid for the variable.

  • Dans Visual Studio, IntelliSense liste les valeurs définies.In Visual Studio, IntelliSense lists the defined values.

Quand vous ne spécifiez pas de valeurs pour les éléments dans la liste d’énumérateurs, les valeurs sont automatiquement incrémentées de 1.When you do not specify values for the elements in the enumerator list, the values are automatically incremented by 1. Dans l’exemple précédent, Day.Sunday a la valeur 0, Day.Monday a la valeur 1 et ainsi de suite.In the previous example, Day.Sunday has a value of 0, Day.Monday has a value of 1, and so on. Quand vous créez un objet Day, il a la valeur par défaut Day.Sunday (0) si vous ne lui assignez pas une valeur explicitement.When you create a new Day object, it will have a default value of Day.Sunday (0) if you do not explicitly assign it a value. Quand vous créez un enum, sélectionnez la valeur par défaut la plus logique et affectez-lui une valeur égale à zéro.When you create an enum, select the most logical default value and give it a value of zero. Ainsi, tous les enums auront cette valeur par défaut si aucune valeur ne leur est assignée explicitement lors de leur création.That will cause all enums to have that default value if they are not explicitly assigned a value when they are created.

Si la variable meetingDay est de type Day, alors (sans un cast explicite) vous pouvez uniquement lui affecter l’une des valeurs définies par Day.If the variable meetingDay is of type Day, then (without an explicit cast) you can only assign it one of the values defined by Day. Si le jour de la réunion change, vous pouvez affecter une nouvelle valeur de Day à meetingDay :And if the meeting day changes, you can assign a new value from Day to meetingDay:

Day meetingDay = Day.Monday;
//...
meetingDay = Day.Friday;

Notes

Il est possible d’assigner une valeur entière arbitraire à meetingDay.It's possible to assign any arbitrary integer value to meetingDay. Par exemple, cette ligne de code ne produit pas d’erreur : meetingDay = (Day) 42.For example, this line of code does not produce an error: meetingDay = (Day) 42. Toutefois, vous ne devez pas le faire car l’attente implicite est qu’une variable enum ne contiendra que l’une des valeurs définies par l’enum.However, you should not do this because the implicit expectation is that an enum variable will only hold one of the values defined by the enum. Affecter une valeur arbitraire à une variable de type énumération présente un risque élevé d’erreurs.To assign an arbitrary value to a variable of an enumeration type is to introduce a high risk for errors.

Vous pouvez affecter n’importe quelle valeur aux éléments dans la liste d’énumérateurs d’un type énumération, et vous pouvez également utiliser des valeurs calculées :You can assign any values to the elements in the enumerator list of an enumeration type, and you can also use computed values:

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

Types énumération comme indicateurs binairesEnumeration types as bit flags

Vous pouvez utiliser un type énumération pour définir des indicateurs binaires, ce qui permet à une instance du type énumération de stocker n’importe quelle combinaison des valeurs définies dans la liste d’énumérateurs.You can use an enumeration type to define bit flags, which enables an instance of the enumeration type to store any combination of the values that are defined in the enumerator list. (Bien entendu, certaines combinaisons peuvent ne pas être significatives ou autorisées dans votre code de programme.)(Of course, some combinations may not be meaningful or allowed in your program code.)

Pour créer un enum d’indicateurs binaires, vous devez appliquer l’attribut System.FlagsAttribute et définir les valeurs de manière appropriée afin que les opérations au niveau du bit AND, OR, NOT et XOR puissent être effectuées sur elles.You create a bit flags enum by applying the System.FlagsAttribute attribute and defining the values appropriately so that AND, OR, NOT and XOR bitwise operations can be performed on them. Dans l’enum d’indicateurs binaires, incluez une constante nommée avec une valeur zéro qui signifie « aucun indicateur n’est défini. »In a bit flags enum, include a named constant with a value of zero that means "no flags are set." N’attribuez pas la valeur zéro à un indicateur si cela ne signifie pas « aucun indicateur n’est défini ».Do not give a flag a value of zero if it does not mean "no flags are set".

Dans l’exemple suivant, une autre version de l’enum Day, nommée Days, est définie.In the following example, another version of the Day enum, which is named Days, is defined. Days a l’attribut Flags, et à chaque valeur est affectée la puissance de deux supérieure suivante.Days has the Flags attribute, and each value is assigned the next greater power of 2. Cela vous permet de créer une variable Days dont la valeur est Days.Tuesday | Days.Thursday.This enables you to create a Days variable whose value is Days.Tuesday | Days.Thursday.

[Flags]
enum Days
{
    None      = 0b_0000_0000, // 0
    Sunday    = 0b_0000_0001, // 1
    Monday    = 0b_0000_0010, // 2
    Tuesday   = 0b_0000_0100, // 4
    Wednesday = 0b_0000_1000, // 8
    Thursday  = 0b_0001_0000, // 16
    Friday    = 0b_0010_0000, // 32
    Saturday  = 0b_0100_0000  // 64 
}
class MyClass
{
    Days meetingDays = Days.Tuesday | Days.Thursday;
}

Pour définir un indicateur sur un enum, utilisez l’opérateur binaire OR comme indiqué dans l’exemple suivant :To set a flag on an enum, use the bitwise OR operator as shown in the following example:

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

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

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

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

Pour déterminer si un indicateur spécifique est défini, utilisez une opération AND au niveau du bit, comme indiqué dans l’exemple suivant :To determine whether a specific flag is set, use a bitwise AND operation, as shown in the following example:

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

Pour plus d’informations sur les éléments à prendre en compte quand vous définissez des types énumération avec l’attribut System.FlagsAttribute, consultez System.Enum.For more information about what to consider when you define enumeration types with the System.FlagsAttribute attribute, see System.Enum.

Utilisation des méthodes System.Enum pour découvrir et manipuler des valeurs enumUsing the System.Enum methods to discover and manipulate enum values

Tous les enums sont des instances du type System.Enum.All enums are instances of the System.Enum type. Vous ne pouvez pas dériver de nouvelles classes à partir de System.Enum, mais vous pouvez utiliser ses méthodes pour découvrir des informations et manipuler les valeurs d’une instance enum.You cannot derive new classes from System.Enum, but you can use its methods to discover information about and manipulate values in an enum instance.

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

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

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

Pour plus d’informations, consultez System.Enum.For more information, see System.Enum.

Vous pouvez également créer une méthode pour un enum à l’aide d’une méthode d’extension.You can also create a new method for an enum by using an extension method. Pour plus d'informations, voir Procédure : Créer une méthode pour une énumération.For more information, see How to: Create a New Method for an Enumeration.

Voir aussiSee also