Das [Flags]
Attribut sollte immer dann verwendet werden, wenn die Aufzählung eine Sammlung möglicher Werte anstelle eines einzelnen Werts darstellt. Solche Sammlungen werden häufig mit bitweisen Operatoren verwendet, zum Beispiel:
var allowedColors = MyColor.Red | MyColor.Green | MyColor.Blue;
Beachten Sie, dass das [Flags]
Attribut dies nicht selbst aktiviert - alles, was es tut, ist eine schöne Darstellung durch die .ToString()
Methode:
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"
Es ist auch wichtig zu beachten, dass die Aufzählungswerte [Flags]
nicht automatisch zu Zweierpotenzen werden. Wenn Sie die numerischen Werte weglassen, funktioniert die Aufzählung nicht wie bei bitweisen Operationen zu erwarten, da die Werte standardmäßig mit 0 beginnen und inkrementieren.
Falsche Erklärung:
[Flags]
public enum MyColors
{
Yellow, // 0
Green, // 1
Red, // 2
Blue // 3
}
Wenn die Werte auf diese Weise deklariert werden, sind sie Gelb = 0, Grün = 1, Rot = 2, Blau = 3. Dies macht sie als Flags unbrauchbar.
Hier ist ein Beispiel für eine korrekte Deklaration:
[Flags]
public enum MyColors
{
Yellow = 1,
Green = 2,
Red = 4,
Blue = 8
}
Um die unterschiedlichen Werte in Ihrer Eigenschaft abzurufen, haben Sie folgende Möglichkeiten:
if (myProperties.AllowedColors.HasFlag(MyColor.Yellow))
{
// Yellow is allowed...
}
oder vor .NET 4:
if((myProperties.AllowedColors & MyColor.Yellow) == MyColor.Yellow)
{
// Yellow is allowed...
}
if((myProperties.AllowedColors & MyColor.Green) == MyColor.Green)
{
// Green is allowed...
}
Unter der Decke
Dies funktioniert, weil Sie in Ihrer Aufzählung Zweierpotenzen verwendet haben. Unter der Decke sehen Ihre Aufzählungswerte in binären Einsen und Nullen folgendermaßen aus:
Yellow: 00000001
Green: 00000010
Red: 00000100
Blue: 00001000
Nachdem Sie Ihre Eigenschaft AllowedColors mit dem binären bitweisen ODER- |
Operator auf Rot, Grün und Blau festgelegt haben, sieht AllowedColors folgendermaßen aus:
myProperties.AllowedColors: 00001110
Wenn Sie also den Wert abrufen, führen Sie tatsächlich bitweise UND &
für die Werte aus:
myProperties.AllowedColors: 00001110
MyColor.Green: 00000010
-----------------------
00000010 // Hey, this is the same as MyColor.Green!
Der Wert None = 0
Und in Bezug auf die Verwendung von 0
in Ihrer Aufzählung, zitiert aus MSDN:
[Flags]
public enum MyColors
{
None = 0,
....
}
Verwenden Sie None als Namen der Flag-Aufzählungskonstante, deren Wert Null ist. Sie können die Konstante Keine nicht in einer bitweisen UND-Operation verwenden, um nach einem Flag zu testen, da das Ergebnis immer Null ist. Sie können jedoch einen logischen und keinen bitweisen Vergleich zwischen dem numerischen Wert und der Aufzählungskonstante None durchführen, um festzustellen, ob Bits im numerischen Wert gesetzt sind.
Weitere Informationen zum Flags-Attribut und seiner Verwendung finden Sie unter msdn und zum Entwerfen von Flags unter msdn