http://www.cnblogs.com/aiyagaze/archive/2006/09/16/505595.html
.Net C#中枚舉的聲明格式如下所示:
[attributes] [modifiers] enum identifier [:base-type] {enumerator-list} [;]
FlagsAttribute屬性就是枚舉類型的一項可選屬性。它的主要作用是可以將枚舉作為位域處理(P.S. C#不支持位域)。所謂位域是單個存儲單元內(nèi)相鄰二進(jìn)制位的集合。通過為枚舉添加這個屬性,可以改變枚舉的一些行為來滿足我們的需要。
我們聲明這樣一個枚舉,并執(zhí)行如下語句:
enum MyFlags { Flag1, Flag2, Flag3, Flag4};

MyFlags myFlag = MyFlags.Flag2 | MyFlags.Flag3;

Console.WriteLine(myFlag);

得到的結(jié)果是:
Flag4
因為對于整數(shù)來說,|操作就是將其轉(zhuǎn)化為二進(jìn)制再進(jìn)行或運(yùn)算。Flags.Flag2 | Flags.Flag3做的工作實際上是 0001 | 0010 = 0011 = 3再轉(zhuǎn)換成(MyFlags)3就是Flag4了
而如果將枚舉聲明為:
[FlagsAttribute]
enum MyFlags{
Flag1 = 0, //000
Flag2 = 1, //001
Flag3 = 2, //010
Flag4 = 4 //100
};

則上述程序的結(jié)果為:
Flag2,Flag3
這樣做的意義在于我們可以實現(xiàn)“或”的關(guān)系
就上例而言,myFlag可以更直觀的表現(xiàn)為011,因此當(dāng)我們想要檢驗它滿足哪個枚舉值時我們可以使用&操作
if((myFlag & MyFlags.Flag2) == MyFlags.Flag2)
{
Console.WriteLine("true");
}
if((myFlag & MyFlags.Flag3) == MyFlags.Flag3)

{
Console.WriteLine("true");
}

011&001 = 001,011&010 = 010,因此這兩個if都會成立,這就是這種枚舉的意義吧。另外我們應(yīng)當(dāng)注意默認(rèn)初始化的myFlag的值為0,與其作&運(yùn)算不會有任何結(jié)果。 |