C# 入門:列挙型 enum を使って状態管理をわかりやすく
「数字の羅列」から脱却! 状態を名前で表現しよう
目次
はじめに
プログラムで「状態」や「種類」を数値で管理していませんか?
int status = 1; // 1 = アクティブ、2 = 停止中、3 = 削除済み...?
このような「何の数字か分からない問題(マジックナンバー)」を解決するのが 列挙型(enum) です。
列挙型とは?
enum は、名前付きの定数の集まりです。
「状態」「種別」「モード」など、選択肢が限られたデータを表すのに便利です。
基本の構文
enum 列挙名
{
値1,
値2,
値3
}
例:キャラクターの状態を表す
enum CharacterState
{
Idle, // 待機中
Moving, // 移動中
Attacking, // 攻撃中
Dead // 戦闘不能
}
状態に応じた処理を switch で分岐する
static void HandleState(CharacterState state)
{
switch (state)
{
case CharacterState.Idle:
Console.WriteLine("待機中");
break;
case CharacterState.Moving:
Console.WriteLine("移動中");
break;
case CharacterState.Attacking:
Console.WriteLine("攻撃中");
break;
case CharacterState.Dead:
Console.WriteLine("戦闘不能");
break;
}
}
enum の呼び出し例(Mainメソッド)
class Program
{
static void Main()
{
CharacterState current = CharacterState.Moving;
HandleState(current);
current = CharacterState.Attacking;
HandleState(current);
current = CharacterState.Dead;
HandleState(current);
}
}
実行結果:
移動中
攻撃中
戦闘不能
enum の裏側:実は int 型
列挙型は内部的には 整数(int) です。
Console.WriteLine((int)CharacterState.Idle); // 0
Console.WriteLine((int)CharacterState.Moving); // 1
Console.WriteLine((int)CharacterState.Attacking); // 2
Console.WriteLine((int)CharacterState.Dead); // 3
値を指定した列挙型も定義できる
enum HttpStatus
{
OK = 200,
NotFound = 404,
ServerError = 500
}
enum を文字列に変換
CharacterState state = CharacterState.Attacking;
Console.WriteLine(state.ToString()); // "Attacking"
逆に、文字列から enum に変換するには:
CharacterState state = Enum.Parse<CharacterState>("Dead");
enum を使うメリット
メリット | 説明 |
---|---|
可読性が高い | 数字の代わりに名前を使うので意味がわかりやすい |
メンテナンス性 | 状態が一覧で定義されているので変更がしやすい |
安全性が高い | enum に定義された値以外は代入できない(コンパイルエラー) |
デバッグが楽 | 名前がそのまま表示されるので追いやすい |
応用:ビットフラグとしての enum(中級者向け)
複数の状態を同時に表現したい場合は [Flags] 属性を使います。
[Flags]
enum FileAccess
{
None = 0,
Read = 1,
Write = 2,
Execute = 4
}
// 組み合わせて利用可能
FileAccess permission = FileAccess.Read | FileAccess.Write;
Console.WriteLine(permission); // 出力:Read, Write
実践練習:表示用メソッドを追加
名前ではなく、日本語で表示したいときは、switch を使って表示用の処理を作ると便利です。
static string GetStateLabel(CharacterState state)
{
return state switch
{
CharacterState.Idle => "待機中",
CharacterState.Moving => "移動中",
CharacterState.Attacking => "攻撃中",
CharacterState.Dead => "戦闘不能",
_ => "不明"
};
}
練習問題
Q1. 以下の季節を表す enum を作成し、「Spring」のときに「春ですね」と表示せよ。
enum Season { Spring, Summer, Autumn, Winter }
// ヒント
Season current = Season.Spring;
// switch を使って表示
using System;
enum Season
{
Spring,
Summer,
Autumn,
Winter
}
class Program
{
static void Main()
{
Season current = Season.Spring;
switch (current)
{
case Season.Spring:
Console.WriteLine("春ですね");
break;
case Season.Summer:
Console.WriteLine("夏ですね");
break;
case Season.Autumn:
Console.WriteLine("秋ですね");
break;
case Season.Winter:
Console.WriteLine("冬ですね");
break;
}
}
}
まとめ
項目 | 内容 |
---|---|
定義方法 | enum 名前 { 値1, 値2, … } |
特徴 | 数値ではなく名前付きの定数で状態を表現できる |
利点 | 読みやすく、書きやすく、間違いにくくなる |
応用 | switch、ToString、Enum.Parse、Flagsなどで活用可能 |
おわりに
列挙型はシンプルですが、プログラムの意図を明確にするための強力なツールです。
初心者のうちから積極的に使い、「状態を数字ではなく名前で扱う」習慣を身につけましょう。
訪問数 19 回, 今日の訪問数 1回
ディスカッション
コメント一覧
まだ、コメントがありません