<p>L’attribut <code>[Flags]</code> 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 :</p>
<pre><code class="lang-auto">var allowedColors = MyColor.Red | MyColor.Green | MyColor.Blue;
</code></pre>
<p>Notez que l’attribut <code>[Flags]</code> <strong>ne</strong> permet <strong>pas</strong> cela en lui-même - tout ce qu’il fait, c’est permettre une représentation lisible par la méthode <code>.ToString()</code> :</p>
<pre><code class="lang-auto">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"
</code></pre>
<p>Il est également important de noter que <code>[Flags]</code> <strong>ne</strong> fait <strong>pas</strong> 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.</p>
<p>Déclaration incorrecte :</p>
<pre><code class="lang-auto">[Flags]
public enum MyColors
{
Yellow, // 0
Green, // 1
Red, // 2
Blue // 3
}
</code></pre>
<p>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.</p>
<p>Voici un exemple de déclaration correcte :</p>
<pre><code class="lang-auto">[Flags]
public enum MyColors
{
Yellow = 1,
Green = 2,
Red = 4,
Blue = 8
}
</code></pre>
<p>Pour récupérer les valeurs distinctes dans votre propriété, vous pouvez faire ceci :</p>
<pre><code class="lang-auto">if (myProperties.AllowedColors.HasFlag(MyColor.Yellow))
{
// Yellow is allowed...
}
</code></pre>
<p>ou avant .NET 4 :</p>
<pre><code class="lang-auto">if((myProperties.AllowedColors & MyColor.Yellow) == MyColor.Yellow)
{
// Yellow is allowed...
}
if((myProperties.AllowedColors & MyColor.Green) == MyColor.Green)
{
// Green is allowed...
}
</code></pre>
<p><strong>Sous le capot</strong></p>
<p>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) :</p>
<pre><code class="lang-auto"> Yellow:
(Réponse tronquée)</code></pre>