一、列挙型の概念:

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 クラス:

メソッド説明
CompareToこのインスタンスを指定されたオブジェクトと比較し、それらの相対値を示す値を返します。
Equals: このインスタンスが指定されたオブジェクトと等しいかどうかを示します。
Format指定された列挙型の指定された値を、指定された形式を使用して、それと等価な文字列表現に変換します。
GetName指定された列挙体で、指定された値を持つ定数の名前を取得します。
GetNames指定された列挙体の定数名の配列を取得します。
GetTypeCodeこのインスタンスの基になる TypeCode を返します。
GetUnderlyingTye指定された列挙体の基になる型を返します。
GetValues指定された列挙体の定数値の配列
HasFlag現在のインスタンスに 1 つ以上のビットフィールドが設定されているかどうかを確認します。
IsDefined指定された列挙体に指定された値を持つ定数が存在するかどうかを示す値を返します。
Parse1 つ以上の列挙定数の名前または数値の文字列表現を等価な列挙オブジェクトに変換します。パラメーターは、操作で大文字と小文字を区別しないかどうかを指定します。
TryParse1 つ以上の列挙定数の名前または数値の文字列表現を等価な列挙オブジェクトに変換し、変換が成功したかどうかを示す戻り値を返します。

六、フラグ列挙型/ビット列挙型

C# フラグ列挙型(Flags):列挙型は、名前付き定数のセットを宣言するための基本データ型(値型)です。

列挙値は相互に排他的です。一方、ビットフラグ集合は、組み合わせて現れる要素からなるリストであり、通常は「ビットOR」演算で新しい値を組み合わせるように設計されています。

  

列挙型は通常、意味的に比較的独立した数値の集合を表します。そして、列挙型を使用してビットフラグ集合を実装するのは最も完璧な組み合わせであり、略してビット列挙と呼ばれます。

七、ビット列挙型の定義

///<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.......。

原文アドレス: https://www.cnblogs.com/chenyao-1424433719/p/11213658.html