1. 程式人生 > 程式設計 >C#中FlagsAttribute屬性在enum中的應用詳解

C#中FlagsAttribute屬性在enum中的應用詳解

Net C#中列舉的宣告格式如下所示:

[attributes] [modifiers] enum identifier [:base-type] {enumerator-list} [;]

FlagsAttribute屬性就是列舉型別的一項可選屬性。它的主要作用是可以將列舉作為位域處理(P.S. C#不支援位域)。

所謂位域 是單個儲存單元內相鄰二進位制位的集合。

通過為列舉新增這個屬性,可以改變列舉的一些行為來滿足我們的需要。

enum MyFlags { Flag1,Flag2,Flag3,Flag4}; 
MyFlags myFlag = MyFlags.Flag2 | MyFlags.Flag3; 
Console.WriteLine(myFlag);//Flag4

因為對於整數來說,| 操作就是將其轉化為二進位制再進行或運算。Flags.Flag2 | Flags.Flag3做的工作實際上是 0001 | 0010 = 0011 = 3再轉換成(MyFlags)3就是Flag4了

如果列舉宣告如下:

[FlagsAttribute]
enum MyFlags{
   Flag1 = 0,//000
   Flag2 = 1,//001
   Flag3 = 2,//010
   Flag4 = 4   //100
};

則上述結果為Flag2,這樣做的意義在於我們可以實現“或”的關係。

就上例而言,myFlag可以更直觀的表現為011,因此當我們想要檢驗它滿足哪個列舉值時我們可以使用&操作:

if((myFlag & MyFlags.Flag2) == MyFlags.Flag2)
{
   Console.WriteLine("true");
}
if((myFlag & MyFlags.Flag3) == MyFlags.Flag3)
 
{
   Console.WriteLine("true");
}

011&001 = 001,011&010 = 010,因此這兩個if都會成立,這就是這種列舉的意義吧。另外我們應當注意預設初始化的myFlag的值為0,與其作&運算不會有任何結果。

補充知識:C# 使用特性(Attribute)來漢化列舉類

一、新建列舉

public enum CRUD
{
  Create,Retrieve,Update,Delete
}

二、新建特性類

public sealed class ChineseAttribute : Attribute
{
  public string Chinese { get; set; }
  public ChineseAttribute(string _chinese = "未漢化")
  {
    Chinese = _chinese;
  }
}

三、利用反射獲取特性

這裡我們寫一個列舉類的擴充套件方法

public static string GetChinese(this Enum value)
{
  Type objType = value.GetType();
  Type attrType = typeof(ChineseAttribute);

  FieldInfo field = objType.GetField(value.ToString());

  //利用反射找是否有【Chinese】特性
  if (field.IsDefined(attrType))
  {
    var chinese = field.GetCustomAttribute<ChineseAttribute>();
    return chinese.Chinese;
  }
  //沒有定義Chinese特性,直接返回具體指
  return value.ToString();
}

四、給列舉類新增特性

public enum CRUD
{
  [Chinese("建立")]
  Create,[Chinese("讀取")]
  Retrieve,[Chinese]
  Update,Delete
}

五、測試

static void Main(string[] args)
{
  List<MyEnum.CRUD> values = new List<MyEnum.CRUD> 
  { 
    MyEnum.CRUD.Create,MyEnum.CRUD.Delete,MyEnum.CRUD.Retrieve,MyEnum.CRUD.Update 
  };

  foreach (var item in values)
  {
    Console.WriteLine(item.GetChinese());
  }
  Console.Read();
}

效果如下

C#中FlagsAttribute屬性在enum中的應用詳解

以上這篇C#中FlagsAttribute屬性在enum中的應用詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。