【ソースコード有】列挙型とは?C#のenumの使い方を知ろう
今回は列挙型(enum)とはどういう挙動をする変数であるのかについて、実際のソースコードを見ながら使い方を学んでいきましょう。
今回は列挙型(enum)とはどういう挙動をする変数であるのかについて、実際のソースコードを見ながら使い方を学んでいきましょう。
スキルアップ
2023/02/27 UP
- プログラミング
- SE資格・スキル
- C#
enumはC#の変数型のひとつで、列挙型と呼ばれています。 列挙型とは名前が付いた定数の集まりで、曜日や性別、年号など、特定の値しか取らないものを定義するための変数型です。
今回は列挙型(enum)とはどういう挙動をする変数であるのかについて、実際のソースコードを見ながら使い方を学んでいきましょう。
なお、C#の環境構築から始めたい方は、こちらの記事も併せてご確認ください。
C#の入門者が覚えておきたい機能の特徴や開発環境の構築方法
enumってなに?
enum(列挙型)は名前が付いた定数の集まりです。定数は列挙子リストと呼び、曜日などの特定の値しかとらないデータを表現できます。
曜日や月、性別など、決まった数で内容が変動しない複数の値を繰り返し使用する時などに便利で、switch文と組み合わせて使われることが多い変数型です。
enum(列挙型)は特定の値しかとらないデータのこと
特定の値とは、曜日や月、性別、年号など、数が決まっており、内容が変動しない値を指します。定義した列挙型は、Mainメソッド内などから「列挙型名.要素名」の形式で使用できます。
以下のサンプルは、weekと名前を付けたenumの内容を列挙子に定義しています。
サンプルコード:
enum week
{
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
}
enumには日本語を含む2バイト文字の使用も可能です。以下のサンプルでは、年号と付けたenumで、明治から令和までの年号を列挙子に定義しています。
サンプルコード:
enum 年号
{
明治, 大正, 昭和, 平成, 令和
}
このようにenum型は、「enum 変数名{列挙子1, 列挙子2, 列挙子3, 列挙子4,...}」という形で定義します。
また、enumは特に定義しなければ0から順に0、1、2、3、のように連続した定数が関連付けられます。以下のように定数を明示的に示す事ことで、任意の整数値を与えることも可能です。
サンプルコード:
enum 列挙型の名前
{
要素1 = 10,
要素2 = 100,
要素3 = 1000
}
また、以下のように一つだけ値を関連付けると、それ以降は順番に+1された値が関連付けられます。任意の数字から関連付けを行いたい場合に便利です。
サンプルコード:
enum 列挙型の名前
{
要素1 = 1,
要素2,
要素3
}
列挙子の標準の型はint型です。しかし、別の型を指定することも可能です。指定できるデータ型は、byte、sbyte、short、ushort、int、uint、long、ulong のいずれかです。
データ型を定義する場合は、以下のサンプルコードのように「:」を使用します。以下の例ではbyte型の列挙子を持つenumとして定義されました。
サンプルコード:
enum week : byte{
Sunday = 1,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
}
enumはどんなときに使う?
enumは前述の通り、数が決まっており、内容が変動しない値を格納して、繰り返し使用するために用いられます。サービスの種類、内容、製品、地名、カテゴリなど、変更されることがない列挙子を管理するのに便利です。
enumは特にswitch-case文とともに使用する頻度が高く、caseの値にenumの列挙子を指定することで、条件の場合分けに対する可読性をあげられます。
enumの使い方
enumを使用したサンプルを見ながら、その使い方をくわしく学習していきましょう。多くの場合、enumはswitch-case文とともに使用されるため、enumだけでなくswitch-case文の使い方についても同時に学習を進めておくと、より理解が深まります。
enumの基本的な使い方
switch文でcaseの値にenumを使用するのが便利です。下記のサンプルでは曜日を定義したenumを使い、平日と土日を識別しています。
サンプルコード:
namespace sample001
{
enum week
{
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
}
class Sample
{
static void Main()
{
week weeksample = week.Sunday;
switch (weeksample)
{
case week.Sunday:
Console.WriteLine("日曜日です");
break;
case week.Saturday:
Console.WriteLine("土曜日です");
break;
default:
Console.WriteLine("平日です");
break;
}
}
}
}
このサンプルコードを実行すると、以下のような結果が表示されます。
今回のサンプルコードのように、曜日などの特定条件によって異なる挙動をするようなプログラムは、実際の業務でも多用されます。enumを使用したswitch-case文は実務では頻繁に使用するので、基本的な構造や考え方を身につけておきましょう。
enum型をint型に変換する
enum型をint型に変換するには、enum型の定数をint型にキャストします。実際にサンプルコードを見てみましょう。
サンプルコード:
enum week
{
Sunday = 1,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
}
class Sample
{
static void Main()
{
var enumDat = week.Wednesday;
var intDat = (int)enumDat;
Console.WriteLine("[" + enumDat + "]をint型に変換すると、値は[" + intDat + "]になります");
Console.ReadLine();
}
}
このコードを実際に実行すると、以下のようになります。
enumの列挙子がint型に変換されて取得できています。
ビットフラグとして使用する
enum型には、フラグ属性を付与できます。これを付与されたenum型は、「ビットごとのor演算」が行えるビットフィールドとして扱え、1つの値で複数のフラグの組み合わせが可能になります。
enum型をビットフィールドとして使用する場合は、下記のサンプルコードのようにenum型を定義する直前に[Flags]と記述します。
サンプルコード:
[Flags]
enum weekflags
{
Sunday = 1,
Monday = 2,
Tuesday = 4,
Wednesday = 8,
Thursday = 16,
Friday = 32,
Saturday = 64
}
文字列で取得する
enum型の列挙子を文字列として取得するには、ToStringとGetNameの2つの方法があります。それぞれのサンプルコードを見てみましょう。
サンプルコード:
public enum week
{
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
}
// ToStringを使う方法
class Sample01
{
static void Main()
{
week day = week.Monday;
string dayName = day.ToString();
Console.WriteLine(dayName);
Console.ReadKey();
}
}
// GetNameを使う方法
class Sample02
{
static void Main()
{
week day = week.Monday;
string dayName = Enum.GetName(typeof(week), day);
Console.WriteLine(dayName);
Console.ReadKey();
}
}
注意点として、enum型からToStringを使用して文字列を取得すると、処理に時間がかかります。 少数の使用であれば誤差の範囲に収まるため問題ありませんが、多用するとアプリ全体の挙動に影響を及ぼす可能性があります。
ToStringの使用はコードがシンプルでわかりやすく、扱いやすいのですが、使用の頻度と規模によってはGetNameもしくは、今回は紹介していないDictionaryクラスを使用した変換を利用した方が良いでしょう。
enum型は変化のない値を管理するのに便利
enum型はswitch-case文と組み合わせることで、特定の値しかとらないデータを使い回し、条件を分岐させて処理するのに便利です。実務でも頻繁に使用するため、switch-case文と同時に学習を進めることで、より効率よく実用的なスキルを身につけられるでしょう。
使い方次第で複雑な挙動をシンプルに扱えるようになるので、enum型について理解を深めておくことはC#を習得する上で大切なポイントです。