この章は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(); } }