.net column

.NET開発者のためのブログメディア

c#enumとは?便利な使用方法をわかりやすく解説!

2020年05月19日

SE
c#enumとは、どのようなことができるのでしょうか?

PM
複数の定数をまとめて宣言できる言語です。

c#enumとは?

c#におけるenumとは、他の言語と同じように列挙型の宣言に使用し、複数の定数をまとめて宣言できます。似たような意味を持ち、値がまったく変化しない複数の値を何度も使い回したい時に便利です。c#でenumは、よくswitch文と一緒に使われます。定数の定義はconst等を使用してもできますが、それら定数が複数個ありswitch文で並ぶような用途ならconstではなくenumが使えないか見てみましょう。例えば、以下の様なc#のコードは、enumを使って書き換えることができます。const int MEAT_BEEF = 1;const int MEAT_PORK = 2;const int MEAT_BIRD = 3;これをenumに置き換えると、以下のようになります。enum Meat { Beef = 1, Pork, Bird}enumを使うと同じ意図を持つ複数の定数が一つにまとまって、視覚的に分かりやすくなります。

enumの宣言方法

c#でのenum(列挙型)の宣言は以下の通りです。enum オブジェクト名 { メンバー1, メンバー2, メンバー3}この際、各メンバーは0から順に0、1、2、3、と定数が関連付けられます。(メンバー1は「0」、メンバー2は「1」、メンバー3は「2」)また、各メンバーに関連付ける定数を明示的に示す事も可能です。enum オブジェクト名 { メンバー1 = 10, メンバー2 = 20, メンバー3 = 100}この場合はそれぞれのメンバーに明示した値が関連付けられます。上のお肉の例のように、一つだけ値を関連付けると、それ以降は順番に+1された値が関連付けられます。(メンバー1に「1」を指定すれば、メンバー2は「2」、メンバー3は「3」)enum オブジェクト名 { メンバー1 = 1, メンバー2, メンバー3}

enumの使い方

c#でenumを定義したら、「オブジェクト名.メンバー名」の形で定数として利用できます。また、列挙型の変数を宣言し、この変数には列挙型のメンバーを代入して使用することができます。enum Meat { Beef = 1, Pork, Bird}Meat meat = Meat.Beef;meat = 1; // c#ではエラー使いどころは少なくなりますが、キャストすることで整数値を代入することもできます。この場合、メンバーにない値も代入できてしまうので注意してください。meat = (Meat)1;meat = (Meat)100; // エラーではないまた、メンバー名や関連付けられた値をそのまま使いたいこともあるかと思います。そんな時は、ToStringメソッドを使用することで文字列として利用でき、キャストすることで整数値として使用できます。Console.WriteLine(meat.ToString()); // メンバー名「Beef」を出力Console.WriteLine((int)meat); // 関連付けられた値「1」を出力

switch文での使い方

enumはswitch文との相性が良く、一緒に使われることが多いです。caseの値にenumを使うことでコードが読みやすくなります。c#でのenumを使用した、一般的なコードは以下のようになります。switch (meat) { case Meat.Beef: Console.WriteLine(“”牛肉””); break; case Meat.Pork: Console.WriteLine(“”豚肉””); break; case Meat.Chicken: Console.WriteLine(“”鶏肉””); break; default: Console.WriteLine(“”肉ではありません””); break;}

enumを使った配列の初期化

c#でenumの宣言をする時に、メンバーが0から順に関連付けられることを利用し、メンバーの最後を要素数として扱うことで、配列を初期化できます。この場合は、定数を関連付けないように注意してください。enum Student { Sato, Suzuki, Takahashi, Tanaka, Ito, Length // 「5」が関連付けられる}String[] roster = new String[(int)Student.Length] { “”佐藤 翔太””, “”鈴木 七海””, “”高橋 大地””, “”田中 未来””, “”伊藤 舞””};// forループで全て出力for (int i = 0; i < (int)Student.Length; i++) { Console.WriteLine(roster[i]);}Console.WriteLine(roster[(int)Student.Suzuki]); // 「鈴木 七海」が出力されるこのメリットは、後々になって列挙型メンバーの追加や削除があった場合に、それに合わせて配列の要素数も自動的に増減してくれるので、修正箇所が少なくなり思わぬバグの発生を未然に減らすことができます。

foreachを使ったenumのループ

c#でenumのメンバー名と値をforeachで参照するには、enumのGetValuesメソッドとGetNameメソッドを利用します。enum Student { Sato, Suzuki, Takahashi, Tanaka, Ito}foreach (int num in Enum.GetValues(typeof(Student))) { Console.WriteLine(“”{0:D}:{1}””, num, Enum.GetName(typeof(Student), num));}

enumでのフラグ管理

c#でenumを複数の定数を同時に持ちたい場合は、ビットフラグを利用します。この場合、enumの宣言時に各メンバーには被らないようにビットを割り当て、使用する時にはビット演算子を使用します。基本的に普通のフラグ管理と同じように、フラグを追加する時は「|」(OR演算子)、削除する時は「&」(AND演算子)と「~」(XOR演算子)を使用し、フラグの判定には「&」(AND演算子)を使用します。また、c#の.net Frameworkにはフラグ管理に便利なHasFlagメソッドが備わっています。従来のように「&」(AND演算子)を使用しても良いですが、便利で読みやすくなるので処理速度を突き詰めているのでなければおすすめです。例えば、ゲームでよくある状態異常なら以下のようになります。enum Status { None = 0, Poison = 0x01, // 毒 Sleep = 0x02, // 睡眠 Palsy = 0x04, // 麻痺}Status player = Status.Poison | Status.Palsy; // 毒と麻痺// 睡眠を追加するplayer |= Status.Sleep;// 麻痺を削除するplayer &= ~Status.Palsy;if (player.HasFlag(Status.Poison)) { // (player & Status.Poison) == Status.Poison Console.WriteLine(“”毒に侵されています””);}if (player.HasFlag(Status.Sleep)) { // (player & Status.Sleep) == Status.Sleep Console.WriteLine(“”眠っています””);}if (player.HasFlag(Status.Palsy)) { // (player & Status.Palsy) == Status.Palsy Console.WriteLine(“”麻痺しています””);}if (player != Status.None) { Console.WriteLine(“”状態異常になっています””);}

SE
enumの使用方法には複数の使い方があるのですね。

PM
そうですね。まずは使って慣れていくのがおすすめなので、実践してみましょう!

enumを使ってみよう

c#におけるenumの宣言方法や、便利な使用方法について解説してきました。今までenumに馴染みのなかった人は、上記の解説とサンプルコードを参考に、enumを使ってみましょう。実際に触れてみることで学べることがあるはずです。


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

求人一覧

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)