[flags]
enmu chl{a=1,b=2,c=3}
用flags聲明了一個位域,與枚舉不同,位域支持不同的&和|操作。
對於普通枚舉,|和&操作代表二進制比特操作
enmu ch{a=1,b=2,c=3}
ch.a|ch.c=01|11=3
ch.a&ch.b=01&10=0
對於位域,|和&操作代表邏輯操作
[flags]
enmu chl{a=1,b=2,c=3}
---------|操作把兩邊位域的元素組合起來(忽略相同部分,並且根據元素的值的和自動轉換)
chl.a|chl.b=chl.3 因為1+2=3 這就是位域根據元素和自動轉換的例子,但有時這也會給我們帶來不便,因為如果chl.c本意不代表chl.a和chl.b的組合,所以我們在設計位域元素值的時候遵循這個原則:從1開始(因為0代表&的無相同元素結果)後一個數是前一個數的2倍,這樣就能保證不出現我們本意之外的自動轉換
enum chl{a=1,b=2,c=4,d=8}。如果某個元素e希望是其他所有元素的組合(a|b|c|d),我們可以把這個元素的值設為所有元素的和
enum chl{a=1,b=2,c=4,d=8,e=15} (一個位域最好只有一個組合值,那就是all元素)
4,判斷時用 if(位域常量組合A==位域常量組合A&位域變量B)判斷位域變量B中是否完全包含位域常量組合A
5, 賦值時用 位域變量=位域變量A&位域變量B
using System;
class Test
{
/// <summary>
/// 把枚舉名稱轉換為數字,1==Left,2==Right,3==Left+Right
/// 如果枚舉的值任意加不等於數字,則返回false
/// </summary>
/// <param name="e"></param>
/// <returns></returns>
static bool IsFlagDefined(Enum e)
{
decimal d;
return !decimal.TryParse(e.ToString(), out d);
}
[Flags] //位域,比普通枚舉更高級
/// <summary>
/// 如果去掉 [Flags] 則不能實現3==Left+Right
/// </summary>
public enum BorderSides { Left = 1, Right = 2, Top = 4, Bottom = 8 }
static void Main()
{
for (int i = 0; i <= 22; i++)
{
//把數字強制轉換為枚舉名稱
BorderSides side = (BorderSides)i;
bool bul = IsFlagDefined(side);
Console.WriteLine(bul + " " + side);
}
}
}