滅入るんるん

何か書きます

Kotlin使いのためのC#入門 Enum Classes

> Top

この章はkotlinlangから大幅に内容を書き換えて紹介します。

まず、KotlinやJavaのenumはクラスのようなものと考えてください。enumの型名を基底クラスとし、要素名が派生クラスと見なせるような実装がされています。(実際にはbytecodeレベルで特殊対応があったりします) そのため、Kotlinのenumではメソッドを定義することができました。 しかし、C#では純粋な列挙型であるため、enumにメソッドを定義することができません。その代わり値型であるためコストが低いことを覚えてください。

enumの定義

enum ObjectType
{
    String, Number, Object
}

C#でのenumの定義はJavaに似ています。

enumでビット演算をし、複数の状態を表したいときはFlagsAttributeを付けてください。

[Flags]
enum ObjectType
{
    String = 1,
    Number = 1 << 1,
    Object = 1 << 2
}

enumの罠

C#のenumは値型なのでコストはいいですが、enumに定義されているメソッドを利用するとパフォーマンスが悪化します。 有名な話なので、気になる方はググってくださいm(__)m

enumにメソッドを定義したいとき

拡張メソッドを使うことでenumにメソッドが定義されているかのように振舞うことができます。

enum ObjectType
{
    String, Number, Object
}

static class ObjectTypeExtension
{
    public static string ToTypeString(this ObjectType objectType)
    {
        switch (objectType)
        {
            case ObjectType.Object: return "Object";
            case ObjectType.Number: return "Number";
            case ObjectType.String: return "String";
        }
        return null;
    }
}

class ObjectTypeProgram
{
    public void Main()
    {
        string typeName = ObjectType.String.ToTypeString();
    }
}