Le secret des [Flags] en C# : comment écrire du code que même les juniors comprendront

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Que se cache-t-il derrière l'attribut [Flags] en C# ?

\n\n

Si vous avez déjà écrit en C# et vu dans le code de quelqu'un d'autre un étrange attribut [Flags] devant un enum, vous vous êtes probablement demandé : "Et si je ne le mets pas, le code cessera-t-il de fonctionner ?"

\n\n

Spoiler : il ne cessera pas de fonctionner. Mais votre code ressemblera à un vélo avec des roues carrées. Aujourd'hui, nous allons voir ce que signifie l'attribut [Flags] en C#, comment l'utiliser correctement en 2025 et pourquoi sans lui vos enum ne sont que des nombres, et non des combinaisons significatives.

\n\n

Le sujet est tiré d'une vraie question sur Stack Overflow qui a recueilli des milliers de vues. Et ce n'est pas un hasard : l'utilisation correcte des indicateurs de bits est l'une de ces compétences qui distingue un développeur qui comprend les rouages du langage de celui qui se contente de "copier-coller depuis MSDN".

\n\n

Qu'est-ce que [Flags] en C# en réalité ?

\n\n

L'attribut [Flags] n'est pas un interrupteur magique qui modifie le comportement du compilateur. C'est un marqueur pour le développeur et pour les outils (par exemple, pour le débogueur Visual Studio ou la sortie console).

\n\n

Lorsque vous écrivez :

\n\n
[Flags]\npublic enum FilePermissions\n{\n    None = 0,\n    Read = 1,\n    Write = 2,\n    Execute = 4,\n    Delete = 8\n}
\n\n

Vous dites : "Hé, cette énumération ne concerne pas le choix d'une seule option, mais la combinaison de plusieurs". Sans l'attribut [Flags], C# ne sait pas que vous allez effectuer des opérations binaires. Mais techniquement, vous le pouvez.

\n\n

Comment fonctionne la magie binaire

\n\n

Les valeurs 1, 2, 4, 8 ne sont pas choisies au hasard. En système binaire, cela donne :

\n
    \n
  • 1 = 0001
  • \n
  • 2 = 0010
  • \n
  • 4 = 0100
  • \n
  • 8 = 1000
  • \n
\n\n

Chaque indicateur occupe son propre bit. Vous pouvez donc combiner Read et Write comme 1 | 2 = 3 (0011). Et le système comprendra : "Oh, les deux indicateurs sont activés".

\n\n

Si vous aviez choisi les valeurs 1, 2, 3, 4 — la combinaison 1 | 2 = 3 serait impossible à distinguer de la valeur Execute = 3. C'est pourquoi les indicateurs de bits nécessitent des puissances de deux.

\n\n

Pourquoi [Flags] est-il nécessaire si on peut simplement mettre des nombres ?

\n\n

Oui, techniquement vous pouvez utiliser des opérations binaires sans l'attribut. Mais :

\n\n
    \n
  • Lisibilité du code : permissions.HasFlag(FilePermissions.Write) est plus clair que (permissions & 2) != 0.
  • \n
  • Débogage : Visual Studio affichera Read, Write au lieu du nombre 3.
  • \n
  • ToString() : l'appel myFlags.ToString() donnera "Read, Write" au lieu de "3".
  • \n
  • Auto-documentation : tout développeur, voyant [Flags], comprendra immédiatement l'intention.
  • \n
\n\n

Sans l'attribut [Flags] en C#, vous perdez tous ces avantages. Le code fonctionne, mais il ressemble à "j'ai écrit ça à 2 heures du matin avant la deadline".

\n\n

Meilleures pratiques pour travailler avec [Flags] en 2025

\n\n

1. Utilisez toujours des puissances de deux

\n\n

C'est la règle numéro un. Les valeurs 1, 2, 4, 8, 16, 32... — et rien d'autre. Pour plus de commodité, vous pouvez utiliser la notation hexadécimale :

\n\n
[Flags]\npublic enum DayOfWeek\n{\n    None    = 0,\n    Monday  = 0b_0000_0001,  // 1\n    Tuesday = 0b_0000_0010,  // 2\n    Wednesday = 0b_0000_0100, // 4\n    Thursday = 0b_0000_1000, // 8\n    Friday  = 0b_0001_0000,  // 16\n    Weekend = Monday | Tuesday | Wednesday | Thursday | Friday\n}
\n\n

Notez : incluez toujours None = 0. Sans cela, votre enum par défaut sera égal à 0, ce qui peut signifier "rien n'est sélectionné".

\n\n

2. Utilisez Enum.HasFlag() — mais avec prudence

Blogs

Book Recommendations