【C#】列挙体

目次

概要

列挙体を使うことでswitch文をもう少し綺麗に書くことができる。
ゲームでも攻撃の「属性」というものが存在するだろう。ポケモンなら「ほのおタイプ」、ドラクエなら「メラ系」など。
これは文字列でもなければ数字でもない。そこで、「特定のどれか」のデータを格納するためのものは列挙体で表せる。

ソースコード

列挙体のクラス

public enum Properties {
    fire, // 火属性
    water, // 水属性
    thunder, // 雷属性
    ice, // 氷属性
    dragon // 龍属性
}

実行部分

double damage = 100;
Properties attackType = Properties.thunder;
switch (attackType) {
    case Properties.fire:
        damage *= 1.0;
        break;
    case Properties.water:
        damage *= 2.0;
        break;
    case Properties.thunder:
        damage *= 0.75;
        break;
    case Properties.ice:
        damage *= 1.5;
        break;
    case Properties.dragon:
        damage *= 1.2;
        break;
}
Console.WriteLine("属性込みのダメージ:" + damage);

実行結果

属性込みのダメージ:75

詳細

列挙体を作成するには以下の通り。

enum /* 列挙体の名前 */ {
    /* 列挙体の要素1 */,
    /* 列挙体の要素2 */,
    /* 列挙体の要素3 */,
           .
           .
           .
}

今回の例の場合、以下の通りになっている。

public enum Properties {
    fire, // 火属性
    water, // 水属性
    thunder, // 雷属性
    ice, // 氷属性
    dragon // 龍属性
}
項目名内容
列挙体の名前Properties
列挙体の要素fire
water
thunder
ice
dragon

そして、列挙体型の変数を作成する時は他の変数と同じように以下のように行える。

Properties attackType = Properties.thunder;

attackTypeはProperties型なので、列挙体の要素のどれかの値が入ることになる。
こうすると、switch文で分岐処理を作りやすくなる。
もし属性を文字列で管理してしまうと、誤字脱字があった場合に思ったような処理が行えなくなってしまう。
例えば「火属性」と「炎属性」では文字列が違うため、同じような意味でも全くの別物と扱われてしまう。

発展編

列挙体は拡張できる。
というのも、今回、確かに列挙体の要素を用意できたが、場合によっては文字列として取り出したい時もあるだろう。
文字列として出力したい場所でその都度分岐処理を用意してもいいが、あまりにメンテナンスがしづらくなる。
なので、列挙体で用意してあげる。

拡張の列挙体は以下のように書く。

public static partial class /* 拡張クラス名 */ {
    public static /* 型名 */ /* メソッド名 */(this /* 列挙体の名前 */ /* 引数名 */) {
        // 行いたい処理
        return /* 戻り値 */
    }
}

今回の例では以下のようになっている。

public enum Properties {
    fire, // 火属性
    water, // 水属性
    thunder, // 雷属性
    ice, // 氷属性
    dragon // 龍属性
}

public static partial class PropertiesExtend {
    public static string getPropertiesName(this Properties property) {
        string propertyString = "";
        switch (property) {
            case Properties.fire:
                propertyString = "火属性";
                break;
            case Properties.water:
                propertyString = "水属性";
                break;
            case Properties.thunder:
                propertyString = "雷属性";
                break;
            case Properties.ice:
                propertyString = "氷属性";
                break;
            case Properties.dragon:
                propertyString = "龍属性";
                break;
        }
        return propertyString;
    }
}
項目名内容
拡張クラス名PropertiesExtend
型名string
今回は文字列として表示しているが、ID番号としてint型(数値)として返すこともある。
メソッド名getPropertiesName
列挙体の名前Properties
引数名property
行いたい処理11~28行目の処理
ここでは、propertyの値によって出力する文字列を決定している
戻り値propertyString(string型)

実行結果

Properties attackType = Properties.thunder;
Console.WriteLine(Properties.thunder.getPropertiesName());

// 実行結果
雷属性

参考ページ