C# 枚舉與位枚舉


一、枚舉的概念:

  C# 枚舉(Enum), 枚舉類型是用於聲明一組命名的常數的基本數據類型(值類型);

二、枚舉的定義:

  聲明enum變量: 

  enum <enum_name> {enumeration list};

  其中enum_name 指定枚舉的類型名稱;  enumeration list 是一個用逗號分隔的標識符列表;

  枚舉列表中的每個符號代表一個整數值,一個比他前面的符號大的整數值。默認情況下,第一個枚舉符號的值是0.例如:

 

 enum Days {Sun , Mon, tue, Fir, sat };

 三、枚舉的案例,枚舉變量的用法:

using System;
namespace EnumApplication
{
    class EnumProgram
    {
          enum Days { Sun, Mon, tue, Wed, thu, Fri, sat };
          
          static void Main(string[] args)
          {
                int WeekdayStart = (int)Days.Mon;
                int WeekdayEnd = (int)Days.Fir;
                Console.WriteLine("Monday:{0}",WeekdayStart);  
                Console.WriteLine("Firday:{0}",WeekdayEnd );  
                Console.ReadKey();
          }    
    }
}

四、Enum類:

  所有枚舉類型都隱式地繼承System.Enum 類型, System.Enum 類型是繼承自System.ValueType類型唯一不為值類型的引用類型;

  

五、Enum 類:

    方法:         名稱:

  1、CompareTo :將此實例與指定對象進行比較並返回一個對二者的相對值的指示;

  2、Equals:指示此實例是否等於指定的對象;

  3、Format:根據指定格式將指定枚舉類型的指定值轉換為其等效的字符串表示形式;

  4、GetName:在指定枚舉中檢索具有指定值的常數的名稱;

  5、GetNames:檢索指定枚舉中常數名稱的數組;

  6、GetTypeCode:返回此實例的基礎TypeCode;

  7、GetUnderlyingTye:返回指定枚舉的基礎類型;

  8、GetValues:指定枚舉中常數值的數組;

  9、HasFlag:確定當前實例中是否設置了一個或多個位域;

  10、IsDefined:返回指定枚舉中是否存在具有指定值的常數的指示;

  11、Parse:將一個或多個枚舉常數的名稱或數字值得字符串表示轉換成等效得枚舉對象,一個參數指定該操作是否不區分大小寫;

  12、TryParse:將一個或多個枚舉常數得名稱或數字值得字符串表示轉換成等效得枚舉對象,用於指示轉換是否成功得返回值;

六、標志枚舉/位枚舉:

  C# 標記枚舉(Flags):枚舉類型是用於聲明一組命名得常數得基本類型數據(值類型)。

  枚舉值是互斥得。而位標記集合是一種由組合出現得元素形成得列表,通常設計為以“位或”運算組合新值;

  枚舉類型則通常表達一種語義相對獨立得數值集合。而以枚舉類型來實現位標記集合是最完美得組合,簡稱位枚舉。

七、位枚舉得定義:  

  ///<summary>
  /// 權限枚舉
  ///</summary>
  [Flags]
  public enum permission                     注意加了[Flags]特性后有三種寫法,
  {                                  一種是使用<<符號,
      Unknown = 0; // 也可以寫成0x00或0             第二種是0x01,                
                                    還有一種是直接寫0,1,2,4,8....,
      Create = 1<<0, // 0x01或1                 一般來說是2的n次方來表示。  
                                     注:<<左操作符,表示對這個數進行移位。
      Read = 1<<1,  //0x02或2

      Update = 1<<2, //0x04或4

      Delete = 1<<3  //0x08或8
  }        

八、位枚舉的實例:

 

//1、給用戶創建、讀取,修改和刪除的權限
var parmission = Permission.Create | parmission.Read | parmission.Update | parmission.Delete;

//2、去掉用戶的修改和刪除權限
parmission = parmission &~parmission.Update;
parmission = parmission &~parmission.Delete;

//3、給用戶加上修改的權限
parmission = parmission | parmission.Update;

//4、判斷用戶是否有創建的權限
var isCreate = (parmission & parmission.Create)!=0;
//或者
var isCreate = (parmission & parmission.Create)==parmission.Create;

  這時parmission枚舉的值將變成0+1+4=5,它的ToSting()將變成“parmission.Create,

  parmission.Read”,parmission.Update; 這里我們可以解釋為什么第五個值Delete是8而不能成為5。

  也就是說它的值不應該是前幾項值的復合值。一個比較簡單的方法

  就是用2的n次方來依次位每一項賦值,例如:1,2,4,8,16,32,64.......。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM