機能の拡張 -列挙型-

ホームC#プログラミング応用講義 > 列挙型

目次

基本事項

列挙型
というのは詳しく扱っていませんが、これまでの経験から大体わかっているでしょう。
MessageBoxButtons などがその主な例です。

しかし、列挙型は自分で定義することも非常に簡単です。
定義する際は「enum」キーワードを利用し、以下のようにします。
enum 列挙型名
{
    要素1,
    要素2
}
このように定義した後、「列挙型名.要素1」としてアクセスできます。

実際のサンプルは次の項目でどうぞ。

サンプル

using System;

class Test
{
    enum TRICK
    {
        TRICK1,
        TRICK2,
        TRICK3,
        MovieTRICK
    }
    
    public static void Main(string[] args)
    {
        GetTRICK(TRICK.TRICK1);
        GetTRICK(TRICK.TRICK2);
        GetTRICK(TRICK.TRICK3);
        GetTRICK(TRICK.MovieTRICK);
    }
    
    static void GetTRICK(TRICK tri)
    {
        switch(tri) 
        {
            case TRICK.TRICK1:
                Console.WriteLine("これがすべての始まり -- TRICK");
                break;
            case TRICK.TRICK2:
                Console.WriteLine("人気により2代目登場 -- TRICK2");
                break;
            case TRICK.TRICK3:
                Console.WriteLine("超人気によりゴールデンタイム登場 -- 木曜ドラマ TRICK");
                break;
            case TRICK.MovieTRICK:
                Console.WriteLine("ついに劇場版までも登場 -- TRICK 劇場版");
                break;
        }
    }
}
サンプルを見てわかるように、定義や利用、すべてが単純であり、とてもわかりやすい仕組みをしています。
とはいえ、このサンプルでは少し気を付けなければならないところがあるので、解説しましょう。

switch が久々にお目見えしていますが、その括弧の中にはメソッドで渡された tri が入っています。
case に続くのは
tri.TRICK1
ではなく、
TRICK.TRICK1
とります。

私が列挙型を学んだときにつまずいたのはこの部分でした。
tri には TRICK の実体が入ってるのになぜ? などと考えていたものです。

しかし、列挙型はクラスではなく、型です。tri には実体ではなく、実際は整数値が入っているというから驚き。続きは次の単元で。

すべては整数値

すべては整数値
そう、列挙型は整数値がすべてであり、一見「れっきょー!!」と見えてもただの「0,1,2...」にすぎません。

よって、上のサンプルで言えば
TRICK.TRICK1 == 0
この等式は成立します。

列挙型は整数値と全く同じように利用できますから、例えば for の繰り返しの中に列挙型を入れることができるのです。
そしてまた、上のサンプルの tri には 0 から 3 までの整数値のどれかが入っており、case での判別は 0 から 3 までのどれに値するかにすぎません。

整数値の中でも基本は int ですが、
enum TRICK : byte
とすることで、0から255までの byte 型に設定することもできます。byte 型はこの列挙型では非常によく利用されます。

ちなみに、列挙型はクラスから引き離すこともできます。
列挙型 TRICK の定義部分をピピーと引っ張って、クラスの外に出してもコンパイルすることができます。

なぜなら列挙型は他のメンバよりも独立性が高く、それ単体で「」を成すことができるからです。
よって列挙型はメンバではなく、位置づけはクラスに近いといえるでしょう。

列挙型の要素(メンバ)は、あらかじめ整数値を代入しておくことも可能です。そうすると、そのメンバ以降は「前のメンバ + 1」が自動的に設定されます。
enum TRICK
{
    TRICK1,
    TRICK2 = 20,
    TRICK3,
    MovieTRICK
}
この場合、TRICK3 には 21 が、MovieTRICK には 22 入っています。入っているというよりそのものです。
実際は途中から値を変化させることは極めて少なく、値を代入する場合はすべて代入しないとわかりにくくてなりません。

列挙型に関してはこれですべてです。これで列挙型を定義するのも利用するのもすべて事足りるでしょう。

列挙型を利用する理由は、そのわかりやすさにあります。
上のサンプルでも、メソッドに値を渡す際、非常にわかりやすく、実際は整数が動いてるなどということは想像できません。
人間の言語に近い形で選択することができるという点で多く利用されます。

MessageBoxButtons や MessageBoxIcon なども、そのメンバの指定が非常にスムーズに行きます。
これが整数で指定するときのことを考えてみてください。Color.Red などの指定もそうです。

列挙型を利用することで、よりスムーズでスマートなプログラムを記述できます。
列挙しなければならない要素があれば列挙型を利用しましょう。

[ ステップアップC# ] [ C#プログラミング応用講義 ]