C# : Les enums
Énumérations, constantes nommées, flags et bonnes pratiques - comment utiliser les enums en C#.
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
}enum Statut{ EnAttente, EnCours, Termine, Annule}Chaque valeur est associée à un entier en coulisse. Par défaut, ça commence à 0 :
| Nom | Valeur |
|---|---|
EnAttente | 0 |
EnCours | 1 |
Termine | 2 |
Annule | 3 |
# Utilisation
Statut etat = Statut.EnCours;
if (etat == Statut.EnCours)
{
Console.WriteLine("La tâche est en cours");
}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"
};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
}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
}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
}[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"Permission droits = Permission.Lecture | Permission.Ecriture; // Vérifier si un flag est présentbool peutLire = droits.HasFlag(Permission.Lecture); // truebool 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; // 1int valeur = (int)Statut.EnCours; // 1Int -> enum
Statut etat = (Statut)2; // TermineStatut 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
}// Parse - plante si la string est invalideStatut etat = Enum.Parse<Statut>("EnCours"); // TryParse - safeif (Enum.TryParse<Statut>("EnCours", out Statut resultat)){ Console.WriteLine(resultat); // EnCours}Enum -> string
string nom = Statut.EnCours.ToString(); // "EnCours"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.EnCoursne 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
intd'un enum en base de données sans documenter la correspondance - sinon personne ne saura ce que3veut 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