列挙型 (C# プログラミング ガイド)Enumeration types (C# Programming Guide)

列挙型 (列挙値または Enum とも呼ばれます) を利用すると、変数に割り当てる一連の名前付き整数定数を効率的に定義できます。An enumeration type (also named an enumeration or an enum) provides an efficient way to define a set of named integral constants that may be assigned to a variable. たとえば、値が週の曜日を表す変数を定義するとします。For example, assume that you have to define a variable whose value will represent a day of the week. その変数が格納するのは 7 つの意味のある値だけです。There are only seven meaningful values which that variable will ever store. これらの値を定義するために、列挙型を利用できます。列挙型は enum キーワードで宣言されます。To define those values, you can use an enumeration type, which is declared by using the enum keyword.

enum Day { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
enum Month : byte { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec }; 

既定では、列挙の各要素の基になる型は int です。前の例のように、コロンを使用し、別の整数型を指定できます。By default the underlying type of each element in the enum is int. You can specify another integral numeric type by using a colon, as shown in the previous example. 使用可能な型の一覧については、「enum (C# リファレンス)」を参照してください。For a full list of possible types, see enum (C# Reference).

次の例のように、基になる型に型変換することで、基になる数値を確認できます。You can verify the underlying numeric values by casting to the underlying type, as the following example shows.

Day today = Day.Monday;
int dayNumber =(int)today;
Console.WriteLine("{0} is day number #{1}.", today, dayNumber);

Month thisMonth = Month.Dec;
byte monthNumber = (byte)thisMonth;
Console.WriteLine("{0} is month number #{1}.", thisMonth, monthNumber);

// Output:
// Monday is day number #1.
// Dec is month number #11.

数値型ではなく列挙型を使用する利点を次に示します。The following are advantages of using an enum instead of a numeric type:

  • 変数に対して有効な値をクライアント コードのために明確に指定します。You clearly specify for client code which values are valid for the variable.

  • Visual Studio の IntelliSense で、定義済みの値が一覧表示されます。In Visual Studio, IntelliSense lists the defined values.

列挙子一覧に要素の値を指定しないとき、値は自動的に 1 ずつ増えます。When you do not specify values for the elements in the enumerator list, the values are automatically incremented by 1. 前の例では、Day.Sunday の値が 0 で、Day.Monday の値が 1 です。その後も同様に 1 ずつ増えます。In the previous example, Day.Sunday has a value of 0, Day.Monday has a value of 1, and so on. 新しい Day オブジェクトを作成するとき、明示的に値を割り当てない場合、Day.Sunday の既定値 (0) が与えられます。When you create a new Day object, it will have a default value of Day.Sunday (0) if you do not explicitly assign it a value. 列挙を作成するときは、最も論理的な既定値を選択し、それにゼロの値を与えます。When you create an enum, select the most logical default value and give it a value of zero. それにより、列挙を作成したときに明示的に値を割り当てない場合、すべての列挙にその既定値が与えられます。That will cause all enums to have that default value if they are not explicitly assigned a value when they are created.

変数 meetingDay の型が Day の場合、(明示的な型変換なしで) Day により定義される値の 1 つのみを割り当てることができます。If the variable meetingDay is of type Day, then (without an explicit cast) you can only assign it one of the values defined by Day. 会議の日が変更されたら、Day から meetingDay に新しい値を割り当てることができます。And if the meeting day changes, you can assign a new value from Day to meetingDay:

Day meetingDay = Day.Monday;
//...
meetingDay = Day.Friday;

注意

任意の整数値を meetingDay に割り当てることができます。It's possible to assign any arbitrary integer value to meetingDay. たとえば、meetingDay = (Day) 42 というコード行はエラーを生成しません。For example, this line of code does not produce an error: meetingDay = (Day) 42. ただし、これは行わないでください。列挙変数は列挙により定義される値の 1 つのみを保持すると暗黙的に予想されるためです。However, you should not do this because the implicit expectation is that an enum variable will only hold one of the values defined by the enum. 列挙型の変数に任意の値を割り当てると、エラーが発生する可能性が高くなります。To assign an arbitrary value to a variable of an enumeration type is to introduce a high risk for errors.

ある列挙型の列挙子一覧の要素に任意の値を割り当てることができます。また、計算された値を利用することもできます。You can assign any values to the elements in the enumerator list of an enumeration type, and you can also use computed values:

enum MachineState
{
    PowerOff = 0,
    Running = 5,
    Sleeping = 10,
    Hibernating = Sleeping + 5
}

ビット フラグとしての列挙型Enumeration types as bit flags

列挙型を利用してビット フラグを定義できます。ビット フラグを定義すると、列挙型のインスタンスは列挙子一覧で定義されている値のあらゆる組み合わせを格納できます。You can use an enumeration type to define bit flags, which enables an instance of the enumeration type to store any combination of the values that are defined in the enumerator list. (もちろん、意味のない組み合わせやプログラム コードで許可されない組み合わせもあります。)(Of course, some combinations may not be meaningful or allowed in your program code.)

ビット フラグ列挙を作成するには、System.FlagsAttribute 属性を適用し、ビット処理演算の ANDORNOTXOR を実行できるように値を定義します。You create a bit flags enum by applying the System.FlagsAttribute attribute and defining the values appropriately so that AND, OR, NOT and XOR bitwise operations can be performed on them. ビット フラグ列挙に、"フラグが設定されていない" という意味のゼロの値を持つ名前付き定数を追加します。In a bit flags enum, include a named constant with a value of zero that means "no flags are set." "フラグが設定されていない" という意味ではない場合、ゼロの値をフラグに指定しないでください。Do not give a flag a value of zero if it does not mean "no flags are set".

次の例では、Day 列挙の別のバージョンが定義されています。Days という名前が付いています。In the following example, another version of the Day enum, which is named Days, is defined. DaysFlags 属性が与えられており、各値に次の大きい 2 の累乗が割り当てられています。Days has the Flags attribute, and each value is assigned the next greater power of 2. これにより、値が Days.Tuesday | Days.Thursday になる Days 変数を作成できます。This enables you to create a Days variable whose value is Days.Tuesday | Days.Thursday.

[Flags]
enum Days
{
    None = 0x0,
    Sunday = 0x1,
    Monday = 0x2,
    Tuesday = 0x4,
    Wednesday = 0x8,
    Thursday = 0x10,
    Friday = 0x20,
    Saturday = 0x40
}
class MyClass
{
    Days meetingDays = Days.Tuesday | Days.Thursday;
}

列挙にフラグを設定するには、次の例のように、ビット処理演算子 OR を利用します。To set a flag on an enum, use the bitwise OR operator as shown in the following example:

// Initialize with two flags using bitwise OR.
meetingDays = Days.Tuesday | Days.Thursday;

// Set an additional flag using bitwise OR.
meetingDays = meetingDays | Days.Friday;

Console.WriteLine("Meeting days are {0}", meetingDays);
// Output: Meeting days are Tuesday, Thursday, Friday

// Remove a flag using bitwise XOR.
meetingDays = meetingDays ^ Days.Tuesday;
Console.WriteLine("Meeting days are {0}", meetingDays);
// Output: Meeting days are Thursday, Friday

特定のフラグが設定されているかどうかを判断するには、次の例のように、ビット処理演算 AND を利用します。To determine whether a specific flag is set, use a bitwise AND operation, as shown in the following example:

// Test value of flags using bitwise AND.
bool test = (meetingDays & Days.Thursday) == Days.Thursday;
Console.WriteLine("Thursday {0} a meeting day.", test == true ? "is" : "is not");
// Output: Thursday is a meeting day.

System.FlagsAttribute 属性を使用して列挙型を定義する際の検討事項の詳細については、System.Enum に関する記事を参照してください。For more information about what to consider when you define enumeration types with the System.FlagsAttribute attribute, see System.Enum.

System.Enum メソッドを利用して列挙値を検出し、操作するUsing the System.Enum methods to discover and manipulate enum values

列挙はすべて、System.Enum 型のインスタンスです。All enums are instances of the System.Enum type. System.Enum から新しいクラスを派生させることはできませんが、このメソッドを利用して列挙インスタンスの値に関する情報を検出し、操作できます。You cannot derive new classes from System.Enum, but you can use its methods to discover information about and manipulate values in an enum instance.

string s = Enum.GetName(typeof(Day), 4);
Console.WriteLine(s);

Console.WriteLine("The values of the Day Enum are:");
foreach (int i in Enum.GetValues(typeof(Day)))
    Console.WriteLine(i);

Console.WriteLine("The names of the Day Enum are:");
foreach (string str in Enum.GetNames(typeof(Day)))
    Console.WriteLine(str);

詳細については、「System.Enum」を参照してください。For more information, see System.Enum.

拡張メソッドを利用して列挙に新しいメソッドを作成することもできます。You can also create a new method for an enum by using an extension method. 詳細については、「方法 : 列挙型対応の新しいメソッドを作成する」を参照してください。For more information, see How to: Create a New Method for an Enumeration.

関連項目See also

System.Enum
C# プログラミング ガイドC# Programming Guide
enumenum