enum (C# リファレンス)
更新 : 2007 年 11 月
enum キーワードは、列挙型を宣言するために使用されます。列挙型は、列挙子リストと呼ばれる名前付き定数の集まりで構成される固有の型です。
通常、列挙型は名前空間内に直接定義して、名前空間内のすべてのクラスが共通の利便性でアクセスできるようにするのが最も適切です。ただし、列挙型はクラスまたは構造体内に入れ子にすることもできます。
既定では、最初の列挙子の値は 0 で、後続の列挙子の値は 1 ずつ増加していきます。次に例を示します。
enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};
この列挙では、Sat は 0、Sun は 1、Mon は 2 のように 1 ずつ増加していきます。列挙子に初期化子を指定すると、既定値をオーバーライドします。次に例を示します。
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 型に追加要素が追加されている場合、既定値のテストで予期しない true が返される場合があります。
作成したコードが他の開発者によって使用される場合は、新しい要素を 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 属性の使用とその効果を示します。
[Flags]
public enum CarOptions
{
SunRoof = 0x01,
Spoiler = 0x02,
FogLights = 0x04,
TintedWindows = 0x08,
}
class FlagTest
{
static void Main()
{
CarOptions options = CarOptions.SunRoof | CarOptions.FogLights;
Console.WriteLine(options);
Console.WriteLine((int)options);
}
}
/* Output:
SunRoof, FogLights
5
*/
説明
この例では、FlagsAttribute を削除すると次のように出力される点に注意してください。
5
5
C# 言語仕様
詳細については、「C# 言語仕様」の次のセクションを参照してください。
1.10 列挙型
6.2.2 明示的な列挙値変換
14 列挙型