- 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」以降であれば、まんまシンボルが出力されます。
|