スポンサーリンク
※サイト運営にサーバーは必須です※
~このサイトもエックスサーバーを使用しています~
目次
列挙型とは
列挙型を使えば、数字に対して、名前を割り振ることができます。
イメージとしては、ある数字が何を意味しているかわかるように、ラベルを貼り付けているようなものです。
※列挙型は、「列挙体」と呼ばれることがあります。
列挙型は以下のように定義されます。
アクセス修飾子 enum:データ型{
列挙子名=値,
…
}
enumは、「イーナム」と読まれることが多いようです。(人によって結構読み方がバラバラだったりします)
※enumの読み方(参考):http://yomikata.org/word/enum
列挙子名に割り振られる整数の型は指定しなければ、int型が採用されます。(int型以外にもbyte,sbyte,short,ushort,uint,long,ulongといった他の整数型も使用できます)
ソースコード(enumを使った場合)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Enum01 { class Program { enum Color { Blue=0, Yellow=1, Red=2 } static void Main(string[] args) { Color state = Color.Yellow; switch (state) { case Color.Blue: Console.WriteLine("信号の色は青です"); break; case Color.Yellow: Console.WriteLine("信号の色は黄です"); break; case Color.Red: Console.WriteLine("信号の色は赤です"); break; default: break; } } } } |
実行結果
信号の色は黄です
Red、Yellow、Blueは「列挙子」と呼ばれます。
ソースコード(enumを使わなかった場合)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Enum02a { class Program { static void Main(string[] args) { int state = 1; switch (state) { case 0: Console.WriteLine("信号の色は青です"); break; case 1: Console.WriteLine("信号の色は黄です"); break; case 2: Console.WriteLine("信号の色は赤です"); break; default: break; } } } } |
実行結果
信号の色は黄です
マジックナンバーについて
ここで、ソースコード(enumを使わなかった場合)を初めて見た人の気持ちになってみましょう。
int state = 1;
ってどういうこと???
と思うはずです。
enumを使ったソースコードを既に見ているので、数字の0が青色、数字の1が黄色、数字の2が赤色だということがわかるでしょう。
しかし、全くの初見だと、それぞれの数字が何を意味しているかわかりません。
プログラムを作った本人は理解できるが、他のプログラマーからは理解できない数字を「マジックナンバー」と呼ばれることがあります(たまに、作成した本人すら何を意味するか忘れたりしますが……)。
今回の場合は、数字の1がマジックナンバーになっています。
チームで仕事をしている場合、「マジックナンバー」を含むソースコードは嫌がられます。
このように数値自体に、何かしらの意味を持たせるのは好ましくありません。
こうした状況に対して、enumが有効な手段になりえます。
素早く記述する方法
switch文とenumの組み合わせはよく使われます。
Visual Studio(以下VSと略す)では、コードスニペットを使用することで素早く書けます。
まず、switch+「Tab」+「Tab」と書くと、以下のコードが素早く書けます。
switch (switch_on)
{
default:
}
switch_onの部分(VS上では、オレンジ色でマークされている)を、今回の場合はstateと書き換えて、「Enter」キーを押すと以下のコードが表示されます。
switch (state)
{
case Color.Blue:
break;
case Color.Yellow:
break;
case Color.Red:
break;
default:
break;
}
割り当てられる数字について
列挙子に割り振られる数字はいかのような規則に従います。
・何も指定しない場合は、0,1,2の順番で割り振られます。
・途中で、数字を指定した場合は、それより後ろの数字は、指定された数字を基準として、数字が順番に割り振られます。
・かぶった数字があった場合、後ろに書かれた方が優先されます(イメージとしては上書きされる感じ)
列挙子に対応する数字が知りたい場合は(int)などの明示的なキャストを使用すればわかります。
ソースコード(数字の割り当てを省略した場合)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Enum05 { class Program { enum Color { Blue, Yellow, Red, White, Black } static void Main(string[] args) { Color c; for (c = Color.Blue; c <= Color.Black; c++) { Console.WriteLine(c + "に対応する数値は" + (int)c); } } } } |
実行結果
Blueに対応する数値は0
Yellowに対応する数値は1
Redに対応する数値は2
Whiteに対応する数値は3
Blackに対応する数値は4
ソースコード(途中で数字を指定した場合)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Enum06 { class Program { enum Color { Blue, Yellow, Red = 5, White, Black } static void Main(string[] args) { Color c; for (c = Color.Blue; c <= Color.Black; c++) { Console.WriteLine(c + "に対応する数値は" + (int)c); } } } } |
実行結果
Blueに対応する数値は0
Yellowに対応する数値は1
2に対応する数値は2
3に対応する数値は3
4に対応する数値は4
Redに対応する数値は5
Whiteに対応する数値は6
Blackに対応する数値は7
ソースコード(かぶった数字があった場合)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Enum07 { class Program { enum Color { Blue = 0, Yellow = 1, Red = 0, White, Black } static void Main(string[] args) { Color c; for (c = Color.Blue; c <= Color.Black; c++) { Console.WriteLine(c + "に対応する数値は" + (int)c); } } } } |
実行結果
Redに対応する数値は0
Whiteに対応する数値は1
Blackに対応する数値は2
ソースコード(int型以外のデータ型を使用した場合。今回はlong型)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Enum08 { class Program { enum Color : long { Blue = -2, Yellow, Red, White, Black } static void Main(string[] args) { Color c; for (c = Color.Blue; c <= Color.Black; c++) { Console.WriteLine(c + "に対応する数値は" + (long)c); } } } } |
実行結果
Blueに対応する数値は-2
Yellowに対応する数値は-1
Redに対応する数値は0
Whiteに対応する数値は1
Blackに対応する数値は2
~プログラミングを勉強してみませんか?~
TechAcademy [テックアカデミー] は無料の体験講座が用意されているので、気軽に体験できます。
※私(サイト主)も無料体験講座を実際に受けてみました(→感想)