LoginSignup
50
26

More than 3 years have passed since last update.

【C#】Enumを使う際のTips

Posted at

最初に

どうも、ろっさむです。

今回はC#でenumキーワードを使用する際の使い方をざっくりまとめていこうと思います。

Enumとは

基本的には曜日や色、月日などの、特定の値しかとらないデータを表現する際に使用します。
これは列挙型(enumeration type)と呼ばれ、enumキーワードを使用します。

public enum Colors
{
    Red,
    Yellow,
    Blue,
    White,
    Black,
}

列挙型要素のデフォルトはintであり0から始まって1ずつ増加していきます。
つまりRed0で、Yellow1Blue2となります。ただし、この数値はオーバーライドすることも可能です。

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を参照しているアセンブリなども再コンパイルする必要が生じます。

参考

50
26
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
50
26