Que signifie l’attribut [Flags] sur un Enum en C# ?
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)*