Initialisation des systèmes...

Baptiste.Dev
Retour aux notes
LangagesDébutantSérie : C# / .NET

C# : Les enums

Énumérations, constantes nommées, flags et bonnes pratiques - comment utiliser les enums en C#.

3 min de lecture
Mis à jour il y a 4 mois
c#csharpenuménumérationflagsconstantes

C# : Les enums

Un enum (énumération) est un type qui définit un ensemble de constantes nommées. Au lieu d'utiliser des nombres magiques ou des strings pour représenter des états, on utilise un enum - c'est lisible, typé et sécurisé.


# Déclaration

enum Statut
{
    EnAttente,
    EnCours,
    Termine,
    Annule
}

Chaque valeur est associée à un entier en coulisse. Par défaut, ça commence à 0 :

NomValeur
EnAttente0
EnCours1
Termine2
Annule3

# Utilisation

Statut etat = Statut.EnCours;
 
if (etat == Statut.EnCours)
{
    Console.WriteLine("La tâche est en cours");
}

Avec un switch

Les enums sont parfaits avec les switch expressions :

string message = etat switch
{
    Statut.EnAttente => "En attente de traitement",
    Statut.EnCours => "Traitement en cours...",
    Statut.Termine => "Terminé avec succès",
    Statut.Annule => "Annulé",
    _ => "Statut inconnu"
};

# Valeurs personnalisées

Tu peux choisir les valeurs entières manuellement :

enum CodeErreur
{
    Succes = 0,
    NonTrouve = 404,
    Interdit = 403,
    ErreurServeur = 500
}

Et changer le type sous-jacent (par défaut int) :

enum Permission : byte  // économie de mémoire
{
    Lecture = 1,
    Ecriture = 2,
    Execution = 4
}

# Flags (combinaison de valeurs)

L'attribut [Flags] permet de combiner plusieurs valeurs d'un enum avec les opérateurs binaires. Chaque valeur doit être une puissance de 2.

[Flags]
enum Permission
{
    Aucune = 0,
    Lecture = 1,       // 0001
    Ecriture = 2,      // 0010
    Execution = 4,     // 0100
    Admin = Lecture | Ecriture | Execution  // 0111
}
Permission droits = Permission.Lecture | Permission.Ecriture;
 
// Vérifier si un flag est présent
bool peutLire = droits.HasFlag(Permission.Lecture);      // true
bool peutExecuter = droits.HasFlag(Permission.Execution); // false
 
Console.WriteLine(droits);  // "Lecture, Ecriture"

Sans [Flags], Console.WriteLine(droits) afficherait juste 3 au lieu de Lecture, Ecriture.


# Conversions

Enum -> int

int valeur = (int)Statut.EnCours;  // 1

Int -> enum

Statut etat = (Statut)2;  // Termine

Le cast ne vérifie pas que la valeur existe dans l'enum. (Statut)99 compile et s'exécute sans erreur - la variable contiendra juste 99 sans nom associé.

String -> enum

// Parse  -  plante si la string est invalide
Statut etat = Enum.Parse<Statut>("EnCours");
 
// TryParse  -  safe
if (Enum.TryParse<Statut>("EnCours", out Statut resultat))
{
    Console.WriteLine(resultat);  // EnCours
}

Enum -> string

string nom = Statut.EnCours.ToString();  // "EnCours"

# Bonnes pratiques

  • Utilise des enums pour tout ensemble fini de valeurs connues (statuts, rôles, jours, niveaux...)
  • Préfère les enums aux strings : Statut.EnCours ne peut pas contenir de typo, "en_cours" si
  • Ajoute toujours un cas _ (default) dans les switch - un jour quelqu'un ajoutera une valeur à l'enum
  • Utilise [Flags] uniquement quand les combinaisons ont du sens (permissions, options)
  • Ne stocke jamais la valeur int d'un enum en base de données sans documenter la correspondance - sinon personne ne saura ce que 3 veut dire dans 6 mois

# La suite

Tu connais maintenant tous les types de base de C# : classes, interfaces, structs, records et enums. Les prochains articles de la série :

  • C# vs .NET - ce qui est du langage et ce qui est du framework