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回

C#,列挙型

Posted by hidepon