C# - 文法など - enum

クラウディア 
1. 概要
2. 変換
3. 型宣言
4. 文字列化

1. 概要

 発音は、違うとわかっていて、「イナム」と呼んでいます。  日本語だと、列挙型というようですな。  「列挙型 - Wikipedia」によれば、「プログラマが選んだ各々の識別子(列挙子)をそのまま有限集合として持つ抽象データ型である」ということだそうです。  例えば、曜日を表現する変数であれば、確実に、日曜日から土曜日まで(何曜日を最初とするかは別の話)のいずれかになるわけです。  こういう変数は、曜日を定義する「enum」型を使っていれば、誤ったコーディングを避けるという上で、便利です。  本ページは、下記のサイトを参考にさせていただきました。
列挙型 - C# リファレンス」
「【C#入門】enum(列挙型)と int 型を相互に変換する方法」
「【C#】Enum を使う際の Tips」
「【C#入門】enumの値を文字列に変換する方法(属性の定義も解説)」
「Enum.GetName メソッド (System)

2. 変換

 「C言語」あたりだと、割とチェックガ緩いので、整数値しかもたない「enum」型と、「int」の変換は、単にキャストすれば、問題なくこんパイルできます。  「C#」も、「enum」を「int」へ変換するのは、単純なキャストで許してもらえます。  しかし、「int」を「enum」へ変換するのは、少しばかり要領が必要です。

enum型 変数名 = (enum型)Enum.ToObject(typeof(enum型), n);
 てな、型変換を行います。

using System;

public enum DayOfWeek
{
	Sunday = 0,
	Monday,
	Tuesday,
	Wednesday,
	Thursday,
	Friday,
	Saturday,
}

public class Program
{
    static public void Main ()
    {
		int n = int.Parse(Console.ReadLine());

		DayOfWeek wday = (DayOfWeek)Enum.ToObject(typeof(DayOfWeek), n);

		switch(wday)
		{
		case DayOfWeek.Sunday:
			Console.WriteLine("["+n+"]は、日曜日です");
			break;

		・・・		略		・・・

		case DayOfWeek.Saturday:
			Console.WriteLine("["+n+"]は、土曜日です");
			break;

		default:
			Console.WriteLine("["+n+"]は、曜日じゃないよ");
			break;
		}
    }
}
 てな、ソースを書いて、コンパイルします。  実行して、1 を入力すると

[1]は、月曜日です
 実行して、8 を入力すると

[8]は、曜日じゃないよ
 と表示されます。

3. 型宣言

 「enum」は、整数しか宣言できないのですが・・・。  その整数も

public enum hogehoge : int
{
	one = 1,
	two = 2,
}
 のように、「:」の後に、「long」「short」「byte」「int」のいずれかをつけることができます。

4. 文字列化

 「enum」を使うにあたって、「enum」の実際の値は、ある意味どうでもよくて、シンボル名が欲しいことが多々あります。  実はそのためのメソッドがあるようで。

Enum.GetNames(type)				// enum の全シンボルを取得
Enum.GetName(Type, Object)		// enum の特定の値のシンボルを取得
 ということができるようなのですが・・・。

using System;

public enum weekDay
{
	Monday,
	Tuesday,
	Wednesday,
	Thursday,
	Friday,
	Saturday,
	Sunday,
}

public class Program
{
    static public void Main ()
    {

      	Console.WriteLine(string.Join(", ", Enum.GetNames(typeof(weekDay))));
      	Console.WriteLine(Enum.GetName(typeof(weekDay), weekDay.Wednesday));
      	Console.WriteLine(weekDay.Wednesday);
    }
}
 てなソースを書いて、ビルド後、実行すると、下記の結果になります。

Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
Wednesday
Wednesday
 してみると、「Enum.GetNames」はともかく、「Enum.GetName」の方は、わざわざ使うこともないのかな・・・と。  以前の、「.NET Framework」だったりすると。

Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
Wednesday
2
 と出力されていたのかしら、少なくとも、「.NET Framework 4.8」以降、「mono 5.10.1.57」以降であれば、まんまシンボルが出力されます。
AbemaTV 無料体験
EMEET 1