こんにちは!エンジニアの中沢です。
C#にはenum(列挙型)という複数の名前に一連の定数を付けるための機能があります。enumはswitch-case文のcaseの値に使用されることが多くあります。
この記事では、「enumとは」「enumの使い方」という基本的な内容から、
- 列挙子の名前を文字列で取得する方法
- enumとint型を相互に変換する方法
- enumの値と名前をforeachで列挙する方法
などの応用的な使い方に関しても解説していきます。今回はこれらの方法を覚えるために、enum(列挙型)のさまざまな使い方をわかりやすく解説します!
enumとは
enumは列挙型を使用するために使います。列挙型とは名前の付いた定数の集まりです。列挙型で定義される定数は列挙子リストと呼ばれます。
デフォルトでは列挙子に、0(ゼロ)から順に整数値が付けられます。付けられる整数値の型は、byte、sbyte、short、ushort、int、uint、long、ulongに限られています。最初の値を0(ゼロ)以外で定義することも可能です。
また、列挙子リストの途中から付ける整数値を変えることもできます。
enumの使い方
enumを定義する方法
enumは以下のように定義します。
enum オブジェクト名 {列挙子1, 列挙子2, ・・・};
列挙子の名前には、英数字を使うことはもちろんですが、日本語を指定することもできます。
ただし、列挙子の名前に空白を使用することはできませんので、注意しましょう。enumの定義の例をみてみましょう。
enum Days { Mon, Tue, Wed, Thu, Fri, Sat, Sun }
以下のように列挙子は日本語でも定義できます。
enum Days { 月曜日, 火曜日, 水曜日, 木曜日, 金曜日, 土曜日, 日曜日 }
列挙子のデフォルトの型はint型ですが、別の型を指定する場合は以下のように指定します。また、初期化子を使って以下のように定数の値を変更することもできます。
enum Days : byte{ Mon = 1, Tue, Wed, Thu, Fri, Sat = 11, Sun }
初期化子を変更すると変更した値から順に定数の値が付けられます。この場合は例えばTueには2が、Wedには3というように定数が付けられます。
switch文で使う方法
enumはswitch-case文とあわせてよく使われます。caseの値にenumの列挙子を指定することで、条件の場合分けが読みやすくなります。サンプルコードで確認しましょう。
using System; namespace Sample { // enumの定義 enum Days { Mon, Tue, Wed, Thu, Fri, Sat, Sun } class Sample { static void Main() { Days day = Days.Wed; switch(day) { case Days.Mon: case Days.Tue: case Days.Wed: case Days.Thu: case Days.Fri: Console.WriteLine("平日です"); break; case Days.Sat: case Days.Sun: Console.WriteLine("休日です"); break; default: Console.WriteLine("不正です"); break; } Console.ReadKey(); } } }
実行結果:
平日です
列挙子の名前をToStringで文字列にして取得する方法
ToStringメソッドを使うと列挙子を文字列に変換することができます。サンプルコードでToStringメソッドの使い方を確認しましょう。
using System; namespace Sample { // enumの定義 enum Days : byte{ Mon = 1, Tue, Wed, Thu, Fri, Sat = 11, Sun } class Sample { static void Main() { Days day = Days.Wed; string dayName = day.ToString(); Console.WriteLine(dayName); Console.ReadKey(); } } }
実行結果:
Wed
enumを文字列に変換する方法についてはこちらの記事で詳しく解説しているので、ぜひ確認してください。
enumとint型を相互に変換する方法
enumをint型に変換する方法
ここでは、enumをint型に変換する方法を解説します。enumの列挙子から値を取得するには、キャストをする必要があります。次のプログラムで確認してみましょう。
using System; namespace Sample { // enumの定義 enum SamuraiEnum { Samurai = 0, Engineer = 1, Juku = 2 } class Sample { static void Main() { // そのまだまと列挙子の名前を取得する Console.WriteLine(SamuraiEnum.Samurai); // キャストすると値を取得できる Console.WriteLine((int)SamuraiEnum.Samurai); Console.ReadKey(); } } }
実行結果:
Samurai 0
このプログラムの結果から、キャストをしない場合には列挙子の名前が取得され、キャストをすると値が取得できることが確認できました。
int型をenumに変換する方法
ここでは、int型をenumに変換する方法を解説します。int型をenumに変換するキャストの方法を次のプログラムで確認してみましょう。
using System; namespace Sample { // enumの定義 enum SamuraiEnum { Samurai = 0, Engineer = 1, Juku = 2 } class Sample { static void Main() { int num = 123; SamuraiEnum sEnum = (SamuraiEnum)Enum.ToObject(typeof(SamuraiEnum), num); Console.WriteLine((int)sEnum); Console.ReadKey(); } } }
実行結果:
123
このようにして、int型をenumに変換することができました。enumとint型を相互に変換する方法についてはこちらの記事で詳しく解説しているので、ぜひ確認してください。
enumの値と名前をforeachで列挙する方法
GetValuesで値と名前を列挙する方法
ここでは、GetValuesで値と名前を列挙する方法を解説します。GetValuesメソッドは、enumの値の配列を返します。GetValuesメソッドで値と名前を取得する方法を次のプログラムで確認してみましょう。
using System; namespace Sample { enum SamuraiEnum { Samurai = 0, Engineer = 1, Juku = 2 } class Sample { static void Main() { foreach (SamuraiEnum Value in Enum.GetValues(typeof(SamuraiEnum))) { string name = Enum.GetName(typeof(SamuraiEnum), Value); Console.WriteLine("{0}:{1}", name, (int)Value); } Console.ReadKey(); } } }
実行結果:
Samurai:0 Engineer:1 Juku:2
このようにして、enumの値と名前を取得して表示することができました。
GetNamesで名前を列挙する方法
ここでは、GetNamesで名前を列挙する方法を解説します。GetNamesメソッドは、enumの名前の配列を返します。GetNamesメソッドで名前を取得する方法を次のプログラムで確認してみましょう。
using System; namespace Sample { enum SamuraiEnum { Samurai = 0, Engineer = 1, Juku = 2 } class Sample { static void Main() { foreach (string name in Enum.GetNames(typeof(SamuraiEnum))) { Console.WriteLine(name); } Console.ReadKey(); } } }
実行結果:
Samurai Engineer Juku
このようにして、enumの名前を取得して表示することができました。enumの値と名前をforeachで列挙する方法についてはこちらの記事で詳しく解説しているので、ぜひ確認してください。
まとめ
いかがでしたか?今回はenum(列挙型)の様々な使い方をまとめて解説しました。enum(列挙型)は複数の定数を扱う場合には便利なので、ぜひ活用してくださいね。もし、enum(列挙型)の使い方を忘れてしまったらこの記事を確認してください!