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

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)*