MADOCHAN BLOG

強いプログラマーを目指す30代のブログ



C#学習初心者が知っておくべきenum(列挙型)の基本

C#にはenum(列挙型)というデータ型があります。
特定の数値を複数の定数にまとめて割り当てることができるenumは、文字列や数値に変換して使うことができます。
また、メソッドを使うことで、enumに含まれる全ての値や名前を簡単に取得することが可能です。

この記事ではenum(列挙型)について、これらの基本的な使い方を解説していきます。

C#のenumとは?

enum(列挙型)とは曜日や季節など特定の値しか取らないものに対して使用する型です。
例えば、血液型を表すために次のような定数があったとします。

class BloodFortune
{

 // 血液型を表す定数群
 public const int A = 0;
 public const int B = 1;
 public const int O = 2;
 public const int AB = 3;
}

こちらはA, B, O, ABの各血液型を定数名として、それぞれに数値をいれているサンプルですが、1つずつ定数を書くよりもまとめて書けたらスッキリしますよね。
その方法がenum(列挙型)です。

enumを用いると以下のように書くことができます。

class BloodFortune
{
 enum Blood
 {
   A,
   B,
   O,
   AB
 }
}

enumを用いたことで、1つの定数に対して長くコードを書く必要が無くなり、まとめて書くことができます。
enumの具体的な書き方は、次で解説していきますね。

C#のenum(列挙型)の基本的な使い方

enumは以下のように書きます。

enum 列挙型名
{
  メンバー1,
  メンバー2,
  メンバー3,
  ...
}

1つずつ定数を書いたときのように、値が入っていないのでは?と思うかもしれませんが、enumを使うと自動で連番の値が入ります。

enum 列挙型名
{
  メンバー1, // メンバー1 = 0
  メンバー2, // メンバー2 = 1
  メンバー3, // メンバー3 = 2
  ...
}

enumを使用するための構文はこちらです。

列挙型名.メンバー名

先ほどの列挙型名BloodのメンバーであるAの値を使用しようとすると、以下のようになります。

using System;

namespace Test
{

 class BloodFortune
 {

   enum Blood
   {
      A,
      B,
      O,
      AB
   }

   static void Main()
   {
      Console.WriteLine(Blood.A);
   }
 }
}
A

Blood(列挙型名).A(メンバー名)としたことで、enumの値を用いることができました。

enum(列挙型)を使用するメリット

enumを使用するメリットは、主に2つあります。

視認性がよくなる

class BloodFortune
{

 // 血液型を表す定数群 → 煩雑
 public const int A = 0;
 public const int B = 1;
 public const int O = 2;
 public const int AB = 3;

  // enumを用いて書く → すっきり!
 enum Blood
 {
   A,
   B,
   O,
   AB
 }
}

このように、ひとつひとつの定数に対して定義をしなくて済むため、見やすくなります。
また、enumではA型が0、B型が1と該当の値を覚える必要はなく、Blood.AがA、Blood.BはBと誰が見ても何の値を示すかがわかりやすくなるのです。

保守性が上がる

class BloodFortune
{

 // 血液型を表す定数群 → 煩雑
 public const int A = 0;
 public const int B = 1;
 public const int O = 2;
 public const int AB = 3;

 // 定数A, B, O, ABのいずれかを受け取ってその値によって処理を実施するメソッド
 public void Fortune(int blood)
 {
  // なんらかの処理
 }
}

この場合、Fortuneメソッドは定数A, B, O, ABのいずれかを受け取ることを想定しています。
しかしint型であればどの値でも受け取ってしまうので、想定していなかった値を受け取ってしまう可能性があります。
想定外の値によって実行時のエラーや意図しない結果を引き起こすかもしれません。

この問題がenumならば解決できるんです!

class BloodFortune
{

 enum Blood
 {
   A,
   B,
   O,
   AB
 }

 // Blood型を受け取ってその値によって処理を実施するメソッド
 public void Fortune(Blood blood)
 {
  // なんらかの処理
 }
}

これによりBlood型で定義されていない定数(値)は指定できなくなります。
指定できない値を設定しているとコンパイラがエラーを報告してくれるので、誤設定を防ぐことができます。

enum(列挙型)を使いこなすために押さえておきたい使い方

enumは自動採番される数値を使うだけでなく、メンバー1、メンバー2などで決めた英数字を使うこともできます。

enumを文字列に変換する方法

enumを文字列に変換する場合は、ToStringメソッドを使用します。

using System;

namespace Test
{

 class BloodFortune
 {

   enum Blood
   {
      A,
      B,
      O,
      AB
   }

   static void Main()
   {
      Blood bloodA = Blood.A;
      string typeA = bloodA.ToString(); // 文字列に変換
      Console.WriteLine(typeA);
   }
 }
}
A

数値ではなく文字列の値が取得できましたよね。
このように、enumで定義した英数字のメンバーを使用することもできます。

enumで文字列を扱う方法

enumで指定できるデータ型は、以下のものに限られています。

byte, byte, short, ushort, int, unit, long, ulong

全て整数型であり、文字列は指定できません。
そのため、enumを以下のように書くとエラーとなります。

enum StringBlood
{
      "A型",
      "B型",
      "O型",
      "AB型"
}

しかし拡張メソッドという方法を使えば、enumで文字列も扱えるのです!

using System;

namespace Test
{

   enum Blood
   {
      A,
      B,
      O,
      AB
   }

   public static class BloodExt
   {

      // 拡張メソッド
      internal static string Ext(this Blood value)
      {
        string[] values = { "A型", "B型", "O型", "AB型" };
        return values[(int)value];
      }
   }

   public class BloodFortune
   {

      static void Main()
      {
        Console.WriteLine(Blood.A.Ext());
      }
   }
}
A型

拡張メソッドとはC#で用意された機能のひとつで、既にある型に後からメソッドを追加するものです。
今回、Blood型のenumにExtというA, B, O, ABそれぞれを文字列に変換するメソッドを追加しています。
Extメソッドの追加によって、enumで文字列を扱うことができるようになりました。

enumを数値に変換する方法

enumを定義した場合、その中の定数には先頭から自動で0, 1, 2…とint値の連番が振られます。
血液型を定義したenumも以下のように、値が割り振られています。

class BloodFortune
{

 enum Blood
 {
   A, // 0
   B, // 1
   O, // 2
   AB // 3
 }
}

この割り振られているint値を取得することでenumを数値に変換ができます。
int値を取得するためには、キャストをします。

using System;

namespace Test
{

 class BloodFortune
 {

   enum Blood
   {
      A,
      B,
      O,
      AB
   }

   static void Main()
   {
      Blood bloodB = Blood.B;
      int typeB = (int)bloodB; // (int)としてint型にキャストする
      Console.WriteLine(typeB);
   }
 }
}
1

int型にキャストすることで、int値を取得し、enumを数値に変換することができました。

知っておくと便利なenum(列挙型)のメソッド

GetValuesメソッド

GetValuesメソッドは、指定したenumに含まれている値を、配列として取得します。

using System;

namespace Test
{

 class BloodFortune
 {

   enum Blood
   {
      A,
      B,
      O,
      AB
   }

   static void Main()
   {

      // Blood型に含まれている値を配列として取得
      var bloodArray = Enum.GetValues(typeof(Blood));

      foreach(var blood in bloodArray)
      {
        Console.WriteLine(blood + "型");
      }
    }
  }
}
A型
B型
O型
AB型

このようにGetValuesメソッドを使うことで、enumに含まれた全ての値を一度に取得し、表示することが可能です。

GetNameメソッド

GetNameメソッドは、enumの指定した値を持つメンバーの名前を取得します。

using System;

namespace Test
{

 class BloodFortune
 {

   enum Blood
   {
      A,
      B,
      O,
      AB
   }

   static void Main()
   {

      // Blood型の3番目のメンバーの名前を取得
      var typeAB = Enum.GetName(typeof(Blood), 3);
      Console.WriteLine(typeAB);
   }
  }
}
AB

GetNameメソッドを用いることで、指定した値のメンバーの名前が取得できました。

まとめ

今回は、C#のenum(列挙型)の基本的な使い方について詳しく解説しました。
enum(列挙型)の値のみ使う方法だけでなく、文字列や数値に変換する方法を覚えておくと、応用が効くのでおすすめです。
ぜひ、使ってみてくださいね!