Atributul [Flags]
ar trebui utilizat ori de câte ori enumerabilul reprezintă o colecție de valori posibile, mai degrabă decât o singură valoare. Astfel de colecții sunt adesea folosite cu operatori pe biți, de exemplu:
var allowedColors = MyColor.Red | MyColor.Green | MyColor.Blue;
Rețineți că atributul [Flags]
nu permite acest lucru de la sine - tot ce face este să permită o reprezentare frumoasă prin metoda .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"
De asemenea, este important să rețineți că [Flags]
nu face automat valorile enumerate cu puteri de două. Dacă omiteți valorile numerice, enumerarea nu va funcționa așa cum s-ar putea aștepta în operațiunile pe biți, deoarece valorile încep implicit cu 0 și cresc.
Declarație incorectă:
[Flags]
public enum MyColors
{
Yellow, // 0
Green, // 1
Red, // 2
Blue // 3
}
Valorile, dacă sunt declarate astfel, vor fi Galben = 0, Verde = 1, Roșu = 2, Albastru = 3. Acest lucru îl va face inutil ca steaguri.
Iată un exemplu de declarație corectă:
[Flags]
public enum MyColors
{
Yellow = 1,
Green = 2,
Red = 4,
Blue = 8
}
Pentru a prelua valorile distincte din proprietatea dvs., puteți proceda astfel:
if (myProperties.AllowedColors.HasFlag(MyColor.Yellow))
{
// Yellow is allowed...
}
sau înainte de .NET 4:
if((myProperties.AllowedColors & MyColor.Yellow) == MyColor.Yellow)
{
// Yellow is allowed...
}
if((myProperties.AllowedColors & MyColor.Green) == MyColor.Green)
{
// Green is allowed...
}
Sub huse
Acest lucru funcționează deoarece ați folosit puteri de doi în enumerarea dvs. Sub coperte, valorile dvs. de enumerare arată astfel în numere binare și zerouri:
Yellow: 00000001
Green: 00000010
Red: 00000100
Blue: 00001000
În mod similar, după ce ați setat proprietatea AllowedColors la Roșu, Verde și Albastru folosind operatorul binar SAU |
, AllowedColors arată astfel:
myProperties.AllowedColors: 00001110
Deci, atunci când recuperați valoarea, efectuați de fapt pe biți și &
pe valori:
myProperties.AllowedColors: 00001110
MyColor.Green: 00000010
-----------------------
00000010 // Hey, this is the same as MyColor.Green!
Valoarea Niciunul = 0
Și în ceea ce privește utilizarea lui 0
în enumerarea dvs., citând din MSDN:
[Flags]
public enum MyColors
{
None = 0,
....
}
Utilizați None ca nume al constantei enumerate de flag a cărei valoare este zero. Nu puteți utiliza constanta enumerată None într-o operație AND pe biți pentru a testa un indicator, deoarece rezultatul este întotdeauna zero. Totuși, puteți efectua o comparație logică, nu pe biți, între valoarea numerică și Nicio constantă enumerată pentru a determina dacă sunt setați biți din valoarea numerică.
Puteți găsi mai multe informații despre atributul flags și despre utilizarea acestuia la msdn și proiectarea steaguri la msdn
person
andynil
schedule
12.08.2008
CatAndDog = Cat | Dog
(SAU logic în loc de Condițional), presupun? - person DdW   schedule 12.09.2016