c#enumとは?便利な使用方法をわかりやすく解説!
- システム
エンジニア - c#enumとは、どのようなことができるのでしょうか?
- プロジェクト
マネージャー - 複数の定数をまとめて宣言できる言語です。
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(“状態異常になっています”);
}
- システム
エンジニア - enumの使用方法には複数の使い方があるのですね。
- プロジェクト
マネージャー - そうですね。まずは使って慣れていくのがおすすめなので、実践してみましょう!
enumを使ってみよう
c#におけるenumの宣言方法や、便利な使用方法について解説してきました。
今までenumに馴染みのなかった人は、上記の解説とサンプルコードを参考に、enumを使ってみましょう。実際に触れてみることで学べることがあるはずです。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。
-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。
C#新着案件New Job
-
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(新宿駅) -
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(新宿駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円神奈川県横浜市(桜木町駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円神奈川県横浜市(桜木町駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(西新宿駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(西新宿駅)