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元素)
chl.c|chl.c=chl.c 这是位域忽略相同部分的例子
----------&操作取得两边位域共有的元素,如果没有相同值,返回值0,如果有相同元素,返回相同元素
chl.b|chl.c&chl.b|chl.a=chl.b
chl.b|chl.c&chl.a|chl.d=0
用if(yy&xxx==yy)判断是否存在yy元素
用if(yy&xxx==0)判断是否不存在yy元素
设计位域是遵循条件
1,带[flags]特性
2,元素值从1开始,后面的元素是前面元素值的2倍,最后一个元素设定为all,值为前面元素值的和
3,使用时用|操作组合元素项
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);
}
}
}