最初に
どうも、ろっさむです。
今回はC#でenumキーワードを使用する際の使い方をざっくりまとめていこうと思います。
Enumとは
基本的には曜日や色、月日などの、特定の値しかとらないデータを表現する際に使用します。
これは**列挙型(enumeration type)
と呼ばれ、enum
キーワード**を使用します。
public enum Colors
{
Red,
Yellow,
Blue,
White,
Black,
}
列挙型要素のデフォルトは**int
型であり、0
から始まって1
ずつ増加していきます。
つまりRed
が0
で、Yellow
が1
、Blue
が2
となります。ただし、この数値はオーバーライドすることも可能**です。
public enum Colors : byte
{
Red = 1,
Yellow = 2,
Blue,
White,
Black = 100,
}
列挙型は**long
,short
,byte
型とデフォルトのint
型のみ宣言することができます。これ以外(例えばchar
)の列挙型を作成することは非推奨となっており、リフレクションを使用して無理に作っても例外がスローされる可能性**があります。
public enum Colors : byte
{
Red,
Yellow,
Blue,
White,
Black,
}
enumの使い方色々
前提コードが以下の状態だとします。
public enum Colors
{
Red,
Yellow,
Blue,
White,
Black,
}
キャストを用いた相互変換
int→enum
int red = 0;
Colors colors = (Colors) red;
enum→int
int red = (int) Colors.Red;
Int32→enum
任意の整数型の値を列挙型に変換するためにはToObject(Type enumType, int value)
メソッドを使用します。このメソッドは**object
型を返すので、更にCastを行う**必要があります。
Int32 red = 0;
Colors colors = (Colors) Enum.ToObject(typeof(Colors), red);
整数をキャストして列挙値に変換する場合の非メンバーの割り当てを回避する方法
-1
など、実際にはメンバーの値として存在しない値でも、castして割り当てることが可能となってしまいます。これを回避するためには以下のように、IsDefined
メソッドを使用する必要があります。
int unknown = -1;
if (Enum.IsDefined(typeof(Colors), unknown))
{
// 処理
}
enum→string
列挙値を文字列変換するためにはToString()
メソッドを使用します。
var red = Colors.Red.ToString();
列挙型要素の全取得方法
System.Enum
クラスのstatic
メソッドを使用した方法がメインとなります。
値の取得
Enum.GetValues
を用いることで、要素の値を取得できます。
foreach (int color in Enum.GetValues(typeof(Colors)))
{
Console.WriteLine(color);
}
要素名の取得
Enum.GetValues
を用いることで、要素の値を取得できます。
foreach (string color in Enum.GetNames(typeof(Colors)))
{
Console.WriteLine(color);
}
ビットフラグとして列挙型を使用する
ビットフラグとして列挙型を使用する場合 FlagsAttribute
属性を付与する必要があります。
[Flags]
public enum Colors
{
Red = 1,
Yellow = 2,
Blue = 4,
White = 8,
Black = 16,
}
詳しい使用方法は以下のブログ記事が参考になります。
↓↓↓↓↓↓↓↓↓
C#で列挙型(enum)をビットフラグとして判定および演算する
Enumを使用する際の注意点
列挙型は定数となるため、enumの値はコンパイル時に定数に置き換えられます。
const定義したものと同様に、enumに変更を加えた場合、そのenumを参照しているアセンブリなども再コンパイルする必要が生じます。