enum (C# リファレンス)
enum キーワードは、列挙型を宣言するために使用されます。列挙型は、列挙子リストと呼ばれる名前付き定数の集まりで構成される固有の型です。
通常、列挙型は名前空間内に直接定義して、名前空間内のすべてのクラスが共通の利便性でアクセスできるようにするのが最も適切です。ただし、列挙型はクラスまたは構造体内に入れ子にすることもできます。
既定では、最初の列挙子の値は 0 で、後続の列挙子の値は 1 ずつ増加していきます。たとえば、次の列挙型では、Sat は 0、Sun は 1、Mon は 2 などとなります。
enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};
列挙型では、次の例に示すように、初期化子を使用して既定値をオーバーライドできます。
enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};
この列挙では、要素の並びは 0 ではなく、1 から開始します。ただし、列挙型には値が 0 となる定数を含めておくことをお勧めします。詳細については、「列挙型 (C# プログラミング ガイド)」を参照してください。
すべての列挙型には基になる型があり、基になる型には char 以外の任意の整数型を指定できます。列挙要素の基になる既定の型は int です。byte など、他の整数型の列挙型を宣言するには、次の例に示すように、識別子に続けてコロンを使用し、その後に型を記述します。
enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};
列挙型で許容される型は、byte、sbyte、short、ushort、int、uint、long、ulong です。
型 Days の変数には、基になる型の範囲内であれば任意の値を割り当てることができます。値は名前付き定数に限定されません。
enum E の既定値は、式 (E)0 によって算出された値です。
[!メモ]
列挙子の名前に空白を使用することはできません。
基になる型は、列挙子ごとに割り当てるストレージの大きさを指定します。ただし、enum 型を整数型に変換するには、明示的なキャストが必要です。たとえば、次のステートメントでは、キャストを使用して enum から int に変換することで、列挙子 Sun を int 型の変数に代入します。
int x = (int)Days.Sun;
列挙型に System.FlagsAttribute を適用し、その要素をビットごとの OR 演算で組み合わせると、一部のツールを使用したときに、enum の動作に属性が反映されることがあります。このような変更は、Console クラス メソッドや式エバリュエーターなどのツールを使用して確認できます (3 番目の使用例を参照してください)。
信頼性の高いプログラミング
定数の場合と同様に、列挙型の個々の値へのすべての参照はコンパイル時に数値リテラルに変換されます。これにより、「定数 (C# プログラミング ガイド)」で説明されているように、バージョン管理の問題が発生する可能性があります。
新しいバージョンの列挙型に追加の値を割り当てるか、新しいバージョンの列挙型メンバーの値を変更すると、依存関係のあるソース コードに問題が発生することがあります。列挙値は、switch ステートメントでよく使用されます。enum 型に追加要素が追加されている場合、switch ステートメントの default セクションが予期せずに選択される場合があります。
作成したコードが他の開発者によって使用される場合は、新しい要素を enum 型に追加したときのコードの動作を規定するガイドラインを用意しておく必要があります。
使用例
次の例では、列挙型 Days を宣言しています。2 つの列挙子は明示的に整数に変換され、整数変数に代入されます。
public class EnumTest
{
enum Days { Sun, Mon, Tue, Wed, Thu, Fri, Sat };
static void Main()
{
int x = (int)Days.Sun;
int y = (int)Days.Fri;
Console.WriteLine("Sun = {0}", x);
Console.WriteLine("Fri = {0}", y);
}
}
/* Output:
Sun = 0
Fri = 5
*/
次の例では、基本型オプションを使用して long 型をメンバーに持つ enum を宣言しています。列挙体の基になる型が long であっても、列挙体メンバーはキャストを使用して long 型に明示的に変換する必要があります。
public class EnumTest2
{
enum Range : long { Max = 2147483648L, Min = 255L };
static void Main()
{
long x = (long)Range.Max;
long y = (long)Range.Min;
Console.WriteLine("Max = {0}", x);
Console.WriteLine("Min = {0}", y);
}
}
/* Output:
Max = 2147483648
Min = 255
*/
次のコード例では、enum 宣言での System.FlagsAttribute 属性の使用とその効果を示します。
// Add the attribute Flags or FlagsAttribute.
[Flags]
public enum CarOptions
{
// The flag for SunRoof is 0001.
SunRoof = 0x01,
// The flag for Spoiler is 0010.
Spoiler = 0x02,
// The flag for FogLights is 0100.
FogLights = 0x04,
// The flag for TintedWindows is 1000.
TintedWindows = 0x08,
}
class FlagTest
{
static void Main()
{
// The bitwise OR of 0001 and 0100 is 0101.
CarOptions options = CarOptions.SunRoof | CarOptions.FogLights;
// Because the Flags attribute is specified, Console.WriteLine displays
// the name of each enum element that corresponds to a flag that has
// the value 1 in variable options.
Console.WriteLine(options);
// The integer value of 0101 is 5.
Console.WriteLine((int)options);
}
}
/* Output:
SunRoof, FogLights
5
*/
コメント
この例から Flags を削除すると、次の値が表示されます。
5
5
C# 言語仕様
詳細については、「C# 言語仕様」を参照してください。言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。