enum型とは
- enum(列挙型)は「意味を持つ整数ラベル」
- デフォルトでは整数値の型はint
- つまり
0, 1, 2, 3のような数値それぞれに何かしらの名前を付けたもの
例:
ex.cs
enum OrderStatus
{
Pending,
Processing,
Completed,
Cancelled
}
| 名前(列挙子) | 値(基になる数値) |
|---|---|
| Pending | 0 |
| Processing | 1 |
| Completed | 2 |
| Cancelled | 3 |
- OrderStatus.Completed:enum型の値
- 2:Completedに対応する値(int)
- Completed:列挙子(数値についた名前)
- 列挙子の整数値を取得するには→ enum型の値を取得 → (int)キャスト
- 整数値 → 列挙子→:enum型にキャスト
ex.cs
//enumを出力→列挙子表示
Console.WriteLine(OrderStatus.Pending);//Pending
//enum→数値に変換
int num = (int)OrderStatus.Pending;
Console.WriteLine(num);//0
//数値を対応するenum型の値に変換
//enum型の値を出力→列挙子表示
OrderStatus attr = (OrderStatus)1;//attr=OrderStatus.Processing
Console.WriteLine(attr);//Processing
enumはコンパイル時定数
Ex.cs
if(status == OrderStatus.Completed)
//コンパイル時にはenum型の値は数値として扱われるので実質以下
if(status == 2)
任意の整数値を与える
Ex.cs
enum Animal{mouse,cat,bird,dog=100,koala,pig=200,lion}
//0,1,2,100,101,200,201
int型以外で宣言
int型以外の整数型を基本に列挙型を作りたいときはコロンで指定
Ex.cs
enum Animal:bite{mouse,cat,bird,dog=100,koala,pig=200,lion}
使用例
注文状態の管理
Ex.cs
OrderStatus status = OrderStatus.Pending;
if (status == OrderStatus.Completed)
{
Console.WriteLine("完了済み");
}
Enumのメソッド
Enum.GetValues
- 列挙体に定義されている全ての値を取得する
- 戻り値は列挙子が要素の配列
ex.cs
enum Status
{
None = 0,
Active = 1,
Inactive = 2
}
foreach (Status s in Enum.GetValues(typeof(Status)))
{
Console.WriteLine(s);
}
None
Active
Inactive
Enum.IsDefined
- 指定した値が列挙体に存在するかチェックする
- 戻り値はbool
ex.cs
enum Status
{
None = 0,
Active = 1,
Inactive = 2
}
bool exists1 = Enum.IsDefined(typeof(Status), 1); // true
bool exists2 = Enum.IsDefined(typeof(Status), 3); // false
bool exists3 = Enum.IsDefined(typeof(Status), "Active"); // true
Console.WriteLine(exists1);
Console.WriteLine(exists2);
Console.WriteLine(exists3);
True
False
True
簡単なコンソールアプリを作ってみる
コンソールアプリ→MVC構成はいらないのでProgram.csだけあればいい
Program.cs
- enumを定義してMain()で使ってConsoleに出力する
- C#プログラムは必ずMain()から始まる
① Program起動
↓
② Main()実行
↓
③ enum定義参照
↓
④ Console出力
↓
⑤ 終了
AnimalをMainから直接参照できてるのはAnimalとProgramが同じnamespaceに属するから
(後述)
ex.cs
using System;
enum Animal
{
mouse,
cat,
bird,
dog = 100,
koala,
pig = 200,
lion
}
class Program
{
static void Main()
{
Animal a = Animal.dog;//aはdogというenum値を保持
Console.WriteLine(Animal.cat);//cat
Console.WriteLine((int)Animal.dog);//100
Console.WriteLine((int)Animal.lion);//201
Console.WriteLine(a);//Animal.dogを表示=dog
}
}
- C#はenumを文字列化して表示
→つまり、Animal.catは内部的にはcat.ToString()が呼ばれている -
(int)Animal.dogはenum → int に明示変換=整数値を表示
スコープ
メソッド内変数
メソッドの中でのみ使える。外からは見えない
クラス内変数(フィールド)
- デフォルトではprivate=クラス内部のみ
- アクセス修飾子をpublicにしたら他クラスから参照可能
同じ namespace にいる型
ex.cs
namespace A
{
class X {}
}
namespace A
{
class Y {}
}
- このときYに
using Aを記述→YからXを使えるようになる - ただし、enumは例外:enumが
-
同じnamespace内にあるならusingがなくてもenumを使える
(今回はこれだった) - 別 namespaceならusingが必要
-
同じnamespace内にあるならusingがなくてもenumを使える
対話型コンソールアプリにした場合
ex.cs
using System;
enum Animal
{
mouse,
cat,
bird,
dog = 100,
koala,
pig = 200,
lion
}
class Program
{
static void Main()
{
Console.WriteLine("動物を入力してください");
Console.WriteLine("mouse, cat, bird, dog, koala, pig, lion");
string input = Console.ReadLine();
// enum変換(超重要)
if (Enum.TryParse(input, out Animal animal))
{
Console.WriteLine("入力成功");
Console.WriteLine("選択された動物:");
Console.WriteLine(animal);
Console.WriteLine("内部値:");
Console.WriteLine((int)animal);
}
else
{
Console.WriteLine("無効な入力です");
}
}
}
コンソール
動物を入力してください
mouse, cat, bird, dog, koala, pig, lion
pig
入力成功
選択された動物:
pig
内部値:
200
-
Console.ReadLine()は、C#などのコンソールアプリケーションで、
ユーザーがキーボードから入力した1行分の文字列を読み込むメソッド -
Enum.TryParseは、文字列(または数値)を安全にC#の列挙型(enum)に変換するメソッド- 変換に失敗しても例外(エラー)を発生させず、成功したかどうかのbool値を返す
- 成功時のみoutパラメータで値を取得できるため、設定値の読み込みなど、不正な文字列が入力される可能性のある場面で推奨される