enum (Référence C#)

Mise à jour : novembre 2007

Le mot clé enum est utilisé pour déclarer une énumération, c'est-à-dire un type distinct constitué d'un ensemble de constantes nommées que l'on appelle « liste d'énumérateurs ».

Généralement, il vaut mieux définir directement un enum dans un espace de noms afin que toutes les classes de cet espace puissent y accéder aussi aisément. Toutefois, un enum peut également être imbriqué dans une classe ou un struct.

Par défaut, le premier énumérateur a la valeur 0, et chaque énumérateur suivant a la valeur n+1. Exemple :

enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};

Dans cette énumération, Sat a la valeur 0, Sun la valeur 1, Mon la valeur 2, et ainsi de suite. Les énumérateurs peuvent comporter des initialiseurs qui se substituent aux valeurs par défaut. Par exemple :

enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

Dans cette énumération, la séquence des éléments est forcée à commencer à 1 au lieu de 0. Toutefois, nous recommandons fortement qu'un enum contienne une constante avec la valeur 0. Pour plus d'informations, consultez Types énumération (Guide de programmation C#).

Chaque type d'énumération a un type sous-jacent qui peut être n'importe quel type intégral sauf char. Le type sous-jacent par défaut des éléments de l'énumération est int. Pour déclarer un enum d'un autre type intégral, tel que octet, utilisez les deux-points après l'identificateur suivi par le type :

enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

Les types approuvés pour un enum sont byte, sbyte, short, ushort, int, uint, long ou ulong.

Une variable de type Days peut recevoir n'importe quelle valeur dans la plage du type sous-jacent ; les valeurs ne sont pas limitées aux constantes nommées.

La valeur par défaut d'un élément enum E correspond au résultat de l'expression (E)0.

Remarque :

Le nom d'un énumérateur ne peut pas contenir d'espace blanc.

Le type sous-jacent spécifie le stockage alloué à chaque énumérateur. Toutefois, une conversion explicite doit être utilisée pour convertir un type enum en type intégral. Par exemple, l'instruction suivante assigne l'énumérateur Sun à une variable du type int en utilisant un cast pour convertir l'enum en int :

int x = (int)Days.Sun;

Lorsque vous appliquez System.FlagsAttribute à une énumération qui contient des éléments combinés à une opération de bits OR, vous remarquez que l'attribut affecte le comportement de l'enum lorsqu'il est utilisé avec certains outils. Vous pouvez remarquer ces modifications lorsque vous utilisez des outils tels que les méthodes de classe de Console, l'évaluateur d'expression, etc. (voir l'exemple 3).

Programmation fiable

Comme avec toute constante, toutes les références aux valeurs individuelles d'un enum sont converties en littéraux numériques au moment de la compilation. Cela peut créer des problèmes de contrôle de version comme décrit dans Constantes (Guide de programmation C#).

L'assignation de valeurs supplémentaires à de nouvelles versions d'enums ou la modification des valeurs des membres enum dans une nouvelle version peut poser des problèmes pour le code source dépendant. Les valeurs enum sont souvent utilisées dans les instructions switch. Si des éléments supplémentaires ont été ajoutés au type enum, le test pour les valeurs par défaut peut retourner true de façon inattendue.

Si d'autres développeurs doivent utiliser votre code, il convient de leur fournir des indications sur la façon dont leur code doit réagir si de nouveaux éléments sont ajoutés à des types enum.

Exemple

Dans cet exemple, l'énumération Days est déclarée. Deux énumérateurs sont explicitement convertis en entiers et assignés à des variables.

public class EnumTest
{
    enum Days { Sun, Mon, Tue, Wed, Thu, Fri, Sat };

    static void Main()
    {
        int x = (int)Days.Sun;
        int y = (int)Days.Fri;
        Console.WriteLine("Sun = {0}", x);
        Console.WriteLine("Fri = {0}", y);
    }
}
/* Output:
   Sun = 0
   Fri = 5
*/

Dans cet exemple, l'option de type de base est utilisée pour déclarer une enum dont les membres sont de type long. Remarquez que bien que le type sous-jacent de l'énumération soit long, les membres de l'énumération doivent encore être convertis explicitement en type long à l'aide d'un cast.

public class EnumTest2
{
    enum Range : long { Max = 2147483648L, Min = 255L };
    static void Main()
    {
        long x = (long)Range.Max;
        long y = (long)Range.Min;
        Console.WriteLine("Max = {0}", x);
        Console.WriteLine("Min = {0}", y);
    }
}
/* Output:
   Max = 2147483648
   Min = 255
*/

L'exemple de code suivant illustre l'utilisation et les effets de l'attribut System.FlagsAttribute sur une déclaration enum.

[Flags]
public enum CarOptions
{
    SunRoof = 0x01,
    Spoiler = 0x02,
    FogLights = 0x04,
    TintedWindows = 0x08,
}

class FlagTest
{
    static void Main()
    {
        CarOptions options = CarOptions.SunRoof | CarOptions.FogLights;
        Console.WriteLine(options);
        Console.WriteLine((int)options);
    }
}
/* Output:
   SunRoof, FogLights
   5
*/

Commentaires

Remarquez que si vous supprimez FlagsAttribute, l'exemple aura pour résultat les éléments suivants :

5

5

Spécification du langage C#

Pour plus d'informations, consultez les sections suivantes dans Spécifications du langage C#.

  • 1.10 Enums

  • 6.2.2 Conversions d'énumération explicites

  • 14 Enums

Voir aussi

Tâches

Attributs, exemple

Concepts

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

Conception d'énumérations

Référence

Mots clés C#

Tableau des types intégraux (Référence C#)

Tableau des types intégrés (Référence C#)

Tableau des conversions numériques implicites (Référence C#)

Tableau des conversions numériques explicites (Référence C#)

Autres ressources

Référence C#