列挙型(enum)とは
プログラミングにおいて、「ステータス(待機中、実行中、完了)」や「カテゴリ(食品、家電、書籍)」のように、関連する定数のセットを扱いたい場面は頻繁にあります。
これらを単なる数値(0, 1, 2)や文字列("Pending", "Running")で管理すると、どのような値が入るべきかが不明確になり、スペルミスや不正な値の代入といったバグの原因になります。
C#の「列挙型(enum)」を使用すると、これらの定数に意味のある名前を付け、一つの型としてグループ化できます。これにより、コードの可読性が向上し、型安全性も確保されます。
enum の基本的な定義
列挙型は enum キーワードを使用して定義します。
// アクセス修飾子 enum 型名
public enum OrderStatus
{
Pending, // 0
Processing, // 1
Shipped, // 2
Delivered, // 3
Cancelled // 4
}
デフォルトでは、最初のメンバーに 0 が割り当てられ、以降は 1 ずつ増加する整数値(int)として扱われます。
コード例:enum と switch 文
定義した列挙型は、変数の型として使用でき、switch 文と組み合わせることで非常に読みやすい条件分岐を記述できます。
ここでは、信号機の色を表す TrafficLight 列挙型を例にします。
using System;
public class EnumSwitchExample
{
public static void Main()
{
// 変数の型に enum を指定
TrafficLight currentSignal = TrafficLight.Yellow;
Console.WriteLine($"現在の信号: {currentSignal}");
// switch 文での分岐
switch (currentSignal)
{
case TrafficLight.Green:
Console.WriteLine("進むことができます。");
break;
case TrafficLight.Yellow:
Console.WriteLine("停止位置を超えていなければ止まれ。");
break;
case TrafficLight.Red:
Console.WriteLine("止まれ。");
break;
default:
Console.WriteLine("信号の状態が不明です。");
break;
}
}
}
// 列挙型の定義
public enum TrafficLight
{
Green,
Yellow,
Red
}
出力結果:
現在の信号: Yellow
停止位置を超えていなければ止まれ。
応用:基底型の変更と値の指定
デフォルトでは enum の内部データは int 型ですが、メモリ効率を考慮して byte や short などに変更することができます。また、各メンバーに対応する整数値を明示的に指定することも可能です。
構文: enum 型名 : 基底型 { メンバー = 値, ... }
コード例:エラーコードの定義
HTTPステータスコードのような、飛び飛びの値を持つ定数グループを定義する例です。
using System;
public class EnumValueExample
{
public static void Main()
{
// 整数 (404) から enum へキャスト(変換)
int code = 404;
ErrorCode error = (ErrorCode)code;
Console.WriteLine($"エラーコード: {(int)error}");
Console.WriteLine($"エラー名: {error}");
}
}
// 基底型を 'short' に指定
public enum ErrorCode : short
{
// 値を明示的に指定
BadRequest = 400,
Unauthorized = 401,
Forbidden = 403,
NotFound = 404,
// 値を指定しない場合、直前の値 + 1 になる
// InternalServerError は 500 になる
InternalServerError = 500,
NotImplemented // 501 になる
}
出力結果:
エラーコード: 404
エラー名: NotFound
まとめ
列挙型(enum)は、関連する定数を型として定義する機能です。
- 定義:
public enum Name { A, B, C } - 利点: コードの意味が明確になり、不正な値の代入を防げます。
- カスタマイズ: 必要に応じて基底型(
byteなど)や、割り当てる数値(= 100)を自由に変更できます。
ステータス管理やオプション設定など、選択肢が決まっているデータを扱う場合は、intやstringではなくenumの使用を第一に検討しましょう。
