C# では enum と呼ばれる列挙型が存在します。いくつかの関連する定数をひとまとめにして管理することができます。
enum を使うことで、
- コードの可読性(読み易さ)を向上させる
- 定義された定数を利用できるので記述ミスを防止できる
- 使用可能な定数を明確化できる
- 定数を複数のクラスで使い回せる
- 定数の変更や追加が発生した場合、少ない修正で対応できる
などのメリットがあります。
この記事では、C# の enum についてサンプルコードを交えて詳しく解説をしていますので、ぜひ参考にしてみて下さい。
オススメの参考書
C#の使い方が丁寧に解説しており、「基礎からしっかりと学びたい」という初心者の方にオススメの一冊です。サンプルコードも記載してあり、各章の最後に復習問題があるので理解度を確認しながら読み進めることができます。新しい C# のバージョンにも対応している書籍です。
enumとは
enum(列挙型)とは、複数の関連する列挙子を1つにまとめて管理する場合に使用されます。
※列挙子とは enum 内で定義される個々の値を指します。
列挙子は定数として enum に定義され、それぞれの定数を識別するために内部では自動で定数の値が整数型で割り当てられます。
列挙型を簡単に説明すると、名前の付いた定数の集まりという事になります。
コード内で特定の名前を表現する際に enum を用いると、コードの意味を理解しやすくなるので可読性が向上するメリットがあります。
enum オブジェクト名
{
定数の名前,
定数の名前,
定数の名前,
定数の名前,
}
enum は{}
(中括弧)内に,
(カンマ区切り)で定数の名前を記述します。
具体的な例をみてみましょう。例えば、日曜日、月曜日、…、土曜日は曜日として1つの集合体として定義することができます。DayOfWeek という名前で enum を定義すると次のようになります。列挙体(enum)の命名規則ですが、通常は大文字で始まるキャメルケース(Camel Case)で記述します。
enum DayOfWeek
{
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
}
定数の値を何も指定してなければ、デフォルトで int 型となり、宣言した順に0から値が割り当てられて1ずつ増加していきます。
上記の例だと Sunday
は0、Modday
は1、Tuesday
は2、Wednesday
は3、Thursday
は4、Friday
は5、Saturday
は6になります。
また enum では利用する型を指定したり、値をオーバーライすることも可能です。
enum オブジェクト名 : 型名
{
定数の名前 = 定数の値,
定数の名前,
定数の名前,
定数の名前,
}
enum で利用できる型はデフォルトの int 型、 uint 型、long 型、ulong 型、short 型、byte 型です。これ以外の型を利用して enum を作成することは非推奨となっています。
次の例では、曜日(日曜日、月曜日、…、土曜日)を byte 型の enum で定義して1から値を割り当てしています。
enum DayOfWeek : byte
{
Sunday = 1,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
}
上記の例だと Sunday
は1、Modday
は2、Tuesday
は3、Wednesday
は4、Thursday
は5、Friday
は6、Saturday
は7になります。
enumの使い方
ここからは enum の使い方について紹介をします。enum は以下のコードを使います。
enum DayOfWeek : uint
{
Sunday = 1,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday = 10,
Saturday,
}
値を取得する(1つ)
定数の値を取得する場合は enum で指定した型でキャスト(enum→型)します。
uint dayOfWeek = (uint)DayOfWeek.Monday;
Console.WriteLine(dayOfWeek);
実行結果は次のようになります。
2
値を取得する(全て)
定数の値を全て取得する場合は Enum.GetValue メソッドを使います。このメソッドは System.Enum クラスに定義された static なメソッドです。
foreach (uint dayOfWeek in Enum.GetValues(typeof(DayOfWeek)))
{
Console.WriteLine(dayOfWeek);
}
実行結果は次のようになります。
1
2
3
4
5
10
11
定数の名前を取得する(1つ)
定数の名前を取得する場合は Enum.ToString メソッドを使います。このメソッドは System.Enum クラスに定義された static なメソッドです。
string dayOfWeek = DayOfWeek.Monday.ToString();
Console.WriteLine(dayOfWeek);
実行結果は次のようになります。
Monday
定数の名前を取得する(全て)
定数の値を全て取得する場合は Enum.GetNames メソッドを使います。このメソッドは System.Enum クラスに定義された static なメソッドです。
foreach (string dayOfWeek in Enum.GetNames(typeof(DayOfWeek)))
{
Console.WriteLine(dayOfWeek);
}
実行結果は次のようになります。
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
任意の定数からenumへ変換する
任意の定数の値を enum (列挙型)に変換するには、Enum.ToObject メソッドを使用します。メソッドの戻り値は object 型なので、enum でキャストします。
uint value = 2;
DayOfWeek dayOfWeek = (DayOfWeek)Enum.ToObject(typeof(DayOfWeek), value);
Console.WriteLine(dayOfWeek);
実行結果は次のようになります。
Monday
enum へ変換する際に、使用する値が 列挙型の定数の値として存在するかどうかを確認する IsDefined メソッドが有ります。このメソッドを利用することで列挙型で使われている定数の値だけを変換できます。
uint value = 100; //DayOfWeekに100は存在しない
if (Enum.IsDefined(typeof(DayOfWeek), value))
{
Console.WriteLine("指定された値は列挙型に存在します");
//変換
DayOfWeek dayOfWeek = (DayOfWeek)Enum.ToObject(typeof(DayOfWeek), value);
Console.WriteLine(dayOfWeek);
}
else
{
Console.WriteLine("指定された値は列挙型に存在しません");
}
実行結果は次のようになります。
指定された値は列挙型に存在しません
文字列からenumへ変換する
文字列から enum (列挙型)に変換するには、Enum.Parse メソッドまたは Enum.TryParse メソッドを使用します。メソッドの戻り値は object 型なので、enum でキャストします。
DayOfWeek dayOfWeek = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), "Monday");
Console.WriteLine(dayOfWeek);
object? result = null;
if (Enum.TryParse(typeof(DayOfWeek), "Monday", false, out result))
{
Console.WriteLine("文字列は変換できました");
Console.WriteLine(result.ToString());
}
else
{
Console.WriteLine("文字列は変換できませんでした");
}
実行結果は次のようになります。
Monday
文字列は変換できました
Monday
switch文でenumを使用する
switch 文の case に列挙型(enum)で定義した定数の名前を指定することで条件分岐の意味が分かりやすくなります。
DayOfWeek dayOfWeek = DayOfWeek.Friday;
switch (dayOfWeek)
{
case DayOfWeek.Sunday:
Console.WriteLine("日曜日");
break;
case DayOfWeek.Monday:
Console.WriteLine("月曜日");
break;
case DayOfWeek.Tuesday:
Console.WriteLine("火曜日");
break;
case DayOfWeek.Wednesday:
Console.WriteLine("水曜日");
break;
case DayOfWeek.Thursday:
Console.WriteLine("木曜日");
break;
case DayOfWeek.Friday:
Console.WriteLine("金曜日");
break;
case DayOfWeek.Saturday:
Console.WriteLine("土曜日");
break;
default:
Console.WriteLine("該当なし");
break;
}
実行結果は次のようになります。
金曜日
まとめ
この記事では、C# の列挙型 enum について使い方とサンプルコードをいつくか紹介しました。
列挙型とは複数の関連する定数を1つの集合体として定義でき、ソースコードの可読性を向上させることができます。
例えば、switch 文で数値を使って分岐させた場合、その条件分岐の意味が分かりづらくなります。列挙型を使うことでソースコード上は意味のある単語が記載されることになり、後からソースコードを読んだ場合や他の方がソースコードを読んだ場合に理解しやすくなります。
ぜひ enum を活用してプログラムを作成してみましょう。
以上、最後まで読んで頂きありがとうございました。