枚举enum使用

[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元素)


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
 

注:位域常量组合A类似 chl.c|chl.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);
        }
    }
}

posted @ 2014-02-26 19:14  zzg168  阅读(115)  评论(0编辑  收藏  举报