Que signifie l'attribut [Flags] sur un Enum en C# ?

ForumBot
Messages : 26117
Inscription : mer. avr. 22, 2026 5:33 pm

Que signifie l'attribut [Flags] sur un Enum en C# ?

Message par ForumBot »

Que signifie l’attribut [Flags] sur un Enum en C# ?

ayi
Site Admin
Messages : 13176
Inscription : mer. avr. 22, 2026 5:21 pm

Re: Que signifie l'attribut [Flags] sur un Enum en C# ?

Message par ayi »

L’attribut [Flags] devrait être utilisé chaque fois que l’énumération représente une collection de valeurs possibles, plutôt qu’une valeur unique. De telles collections sont souvent utilisées avec des opérateurs bit à bit, par exemple :


var allowedColors = MyColor.Red | MyColor.Green | MyColor.Blue;


Notez que l’attribut [Flags] ne permet pas cela en lui-même - tout ce qu’il fait, c’est permettre une représentation lisible par la méthode .ToString() :


enum Suits { Spades = 1, Clubs = 2, Diamonds = 4, Hearts = 8 }
[Flags] enum SuitsFlags { Spades = 1, Clubs = 2, Diamonds = 4, Hearts = 8 }

...

var str1 = (Suits.Spades | Suits.Diamonds).ToString();
// "5"
var str2 = (SuitsFlags.Spades | SuitsFlags.Diamonds).ToString();
// "Spades, Diamonds"


Il est également important de noter que [Flags] ne fait pas automatiquement des valeurs de l’énumération des puissances de deux. Si vous omettez les valeurs numériques, l’énumération ne fonctionnera pas comme on pourrait s’y attendre dans les opérations bit à bit, car par défaut les valeurs commencent à 0 et s’incrémentent.


Déclaration incorrecte :


[Flags]
public enum MyColors
{
Yellow, // 0
Green, // 1
Red, // 2
Blue // 3
}


Les valeurs, si elles sont déclarées de cette manière, seront Yellow = 0, Green = 1, Red = 2, Blue = 3. Cela les rendra inutilisables en tant que drapeaux.


Voici un exemple de déclaration correcte :


[Flags]
public enum MyColors
{
Yellow = 1,
Green = 2,
Red = 4,
Blue = 8
}


Pour récupérer les valeurs distinctes dans votre propriété, vous pouvez faire ceci :


if (myProperties.AllowedColors.HasFlag(MyColor.Yellow))
{
// Yellow is allowed...
}


ou avant .NET 4 :


if((myProperties.AllowedColors & MyColor.Yellow) == MyColor.Yellow)
{
// Yellow is allowed...
}

if((myProperties.AllowedColors & MyColor.Green) == MyColor.Green)
{
// Green is allowed...
}


Sous le capot


Cela fonctionne parce que vous avez utilisé des puissances de deux dans votre énumération. Sous le capot, vos valeurs d’énumération ressemblent à ceci en binaire (uns et zéros) :


 Yellow:

*(Réponse tronquée)*
Répondre

Revenir à « .NET & C# »