枚舉和位標誌

枚舉是程序中常常使用的數據類型,使用枚舉,可讓代碼具備更高的可讀性,易擴展性以及更容易編寫等有點。同時枚舉仍是強類型,提高程序的健壯性。ui

例如要對顏色進行區分,在不使用枚舉時,可能制定約定:定義若干個值: 0,1,2,3分別表明紅,黃,藍,綠四種顏色,可是這會增長程序的維護成本。this

使用枚舉可以很清晰的代表代碼的意圖
enum Color
{
    Red,    //紅
    Yellow, //黃
    Blue,   //藍
    Green   //綠
}
枚舉值的類型

枚舉值的類型能夠是: byte,sbyte,short,ushort,int,uint,long,ulong。默認類型是int,自定義其它類型的枚舉值類型spa

enum Color : byte {}
//獲取枚舉值類型(輸出System.Byte)
System.Console.WriteLine(System.Enum.GetUnderlyingType(typeof(Color)));
獲取全部枚舉值
foreach (var item in (Color[])System.Enum.GetValues(typeof(Color)))
    System.Console.WriteLine(item);

結果
image.pngcode

使用擴展方法向枚舉中添加方法
public static Action Set(this Action flags, Action setAction)
{
    return flags | setAction;
}

//用例
var action = Action.Walk;
//輸出 Walk
Console.WriteLine(action.ToString());
action = action.Set(Action.Run);
//輸出 Walk, Run
Console.WriteLine(action.ToString());
位標誌

位標誌是一種特殊的枚舉類型,枚舉值的存在是互斥的,位標誌能夠理解成是一種組合的列表,如文件的屬性能夠有隱藏與只讀等多種。blog

位標誌的聲明內存

[Flags] //添加Flags標記即可聲明一個位標誌
enum Action
{
    None = 0,
    Walk = 0x0001,
    Run = 0x0002,
    Speak = 0x0004
}
位標誌的實例使用
//聲明一個行爲
var action = Action.None;
//判斷該行爲是否能走 輸出false
Console.WriteLine((action & Action.Walk) != 0);
Console.WriteLine((action & Action.Walk) == Action.Walk);
//添加行走和奔跑行爲
action = action | Action.Walk | Action.Run;
Console.WriteLine((action & Action.Walk) != 0);//true
Console.WriteLine((action & Action.Run) != 0); //true
//刪除走的行爲
action = action &~ Action.Walk;
Console.WriteLine((action & Action.Walk) != 0);//false
Console.WriteLine((action & Action.Run) != 0); //true

使用HasFlag方法判斷枚舉實例中是否存在某個標誌字符串

var action = Action.Run | Action.Speak;
Console.WriteLine(action.HasFlag(Action.Walk));//false
Console.WriteLine(action.HasFlag(Action.Run)); //true

*因爲HasFlag接受一個Enum類型的參數,因此使用該方法須要裝箱,產生一次內存分配工作流

調用ToString方法能更加直觀的看到位標誌的組合it

var action = Action.Run | Action.Speak; //0x0006
//因爲存在[Flags],ToString方法便會將它視爲一組位標誌而不是單獨的數值,因此輸出 Run, Speak
//若是刪除[Flags],程序將輸出 6
Console.WriteLine(action.ToString());
存在位標誌時ToString的工做流程
  1. 獲取枚舉類型定義的數值集並按降序排列
  2. 每一個數值將會與枚舉實例的值進行「按位與」計算,假設結果等於該數值,與該數值關聯的字符串便會追加到輸出字符串中,對應的位會被關閉(設置爲0)
  3. 重複第2步,直到檢查完枚舉實例中的全部位
相關文章
相關標籤/搜索