程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 枚舉enum使用

枚舉enum使用

編輯:C#入門知識

[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);
        }
    }
}

    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved