この章のテーマ §
C#の列挙型の基礎を学びます。列挙型は数値としての正確と文字列的な性格の双方を合わせ持つ特殊な型です。
前提知識 §
Console.WriteLineメソッド, 文字列の基礎, 変数の基礎, 条件演算子, int型, for文, if文
解説 §
世の中では、数値ではなく、文字例でもない型が要求されることがあります。たとえば、性別や、赤組白組の組分けですね。
紅白でチーム分けをすると決まっているとき、赤組と白組以外は存在しません。青組や黄色組はないのです。ですが、文字列では何を書いても許されます。
列挙型は有効な名前だけを列挙して定義します。それ以外の名前は使えません。
最も分かりやすい利用例は、曜日を示すDayOfWeek型です。この型には、SundayからSaturdayまでの7つの値が定義されています。他の名前は記述できません。名前を使用するには型名+"・"+名前を書きます。名前は、変数などと同じ有効なC#の名前である必要があります。(だから"Lucky7"は可ですが、"7thは"不可です)
サンプルソースでは、DayOfWeek.Fridayとして金曜日を直接ソースコードに書いています。
DayOfWeekは定義済みの型ですが、自分で定義することも簡単にできます。サンプルソースの最後の行のように、emumキーワードに続いて波括弧で囲って名前を列挙するだけです。
列挙型の実態はただの整数なので、整数との相互変換ができます。たとえば、この場合"Sex.男"を出力すると「男」ですが、"(int)Sex.男"を出力すると1となります。
名前と数値の対応関係は、基本的に定義で列挙された順番に0から割り当てられます。
罠の数々 §
- 名前と数値の対応関係は自由に変更できるので、常に0から順番とは限らない
- 何も指定しなければ列挙型はint型に対応するが、他の整数型を使用することもできる
参考リンク §
列挙型 (C# リファレンス)
サンプルソース: kw_enum §
var theDay = new DateTime(2029,1,5);
Console.WriteLine(theDay.DayOfWeek);
if (theDay.DayOfWeek == DayOfWeek.Friday) Console.WriteLine("金曜日はゴミの日です。");
Console.WriteLine($"Sex.男={Sex.男}");
Console.WriteLine($"(int)Sex.男={(int)Sex.男}");
for (int i = 0; i < 3; i++)
{
Sex theMan = (Sex)i;
Console.WriteLine($"俺は{theMan}だ!");
}
enum Sex { 女, 男, その他 }
実行結果 §
Friday
金曜日はゴミの日です。
Sex.男=男
(int)Sex.男=1
俺は女だ!
俺は男だ!
俺はその他だ!
リポジトリ §
https://github.com/autumn009/CSharpPrimer2
練習問題 §
Console.WriteLine(DayOfWeek.Friday);を実行すると、Fridayが出力される。
これを「金曜日」に変更することはできるだろうか。
- 地域設定を日本に切り換える
- "Console.WriteLine(DayOfWeek.金曜日)"と書き直す
- 強く願えば願いは叶う
- ライブラリの設定を上書きする定義を行う
- できない。定義がFridayなのでもう変えられない
[[解答]]