C# 列舉與位列舉概述

大雄45發表於2021-01-25
導讀 C# 列舉(Enum), 列舉型別是用於宣告一組命名的常數的基本資料型別(值型別)。

C# 列舉與位列舉概述C# 列舉與位列舉概述

一、列舉的概念

C# 列舉(Enum), 列舉型別是用於宣告一組命名的常數的基本資料型別(值型別);

二、列舉的定義

宣告 enum 變數: 

enum{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 型別唯一不為值型別的引用型別;
C# 列舉與位列舉概述C# 列舉與位列舉概述

五、Enum 類
方法 描述
CompareTo 將此例項與指定物件進行比較並返回一個對二者的相對值的指示
Equals:指示此例項是否等於指定的物件;
Format 根據指定格式將指定列舉型別的指定值轉換為其等效的字串表示形式

GetName 在指定列舉中檢索具有指定值的常數的名稱

GetNames 檢索指定列舉中常數名稱的陣列

GetTypeCode 返回此例項的基礎TypeCode

GetUnderlyingTye 返回指定列舉的基礎型別

GetValues 指定列舉中常數值的陣列

HasFlag 確定當前例項中是否設定了一個或多個位域

IsDefined 返回指定列舉中是否存在具有指定值的常數的指示

Parse 將一個或多個列舉常數的名稱或數字值得字串表示轉換成等效得列舉物件,一個引數指定該操作是否不區分大小寫

TryParse 將一個或多個列舉常數得名稱或數字值得字串表示轉換成等效得列舉物件,用於指示轉換是否成功得返回值
六、標誌列舉/位列舉

C# 標記列舉(Flags):列舉型別是用於宣告一組命名得常數得基本型別資料(值型別)。

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

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

七、位列舉得定義 

 

///  /// 許可權列舉
  ///  [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.......。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2752562/,如需轉載,請註明出處,否則將追究法律責任。

相關文章