Java使いから見たC#(2) -Enum-

ということで、第二回です。
Javaでも2005年からあるEnumについて。

C#では数値と互換性のある構造体として実装されています。

ですので、こんなコードが書ける。

	class MainClass
	{
		public static void Main (string[] args)
		{
			Days d = (Days)1; //うわぁ・・・・・
		}
	}
	enum Days {Sun = 0, Mon, Tue, Wed, Thu, Fri, Sat};

うん、書けるだけで絶対に書きません。
ordinalの初期値を指定できるのはJavaと一緒ですね。
Javaだとordinalの初期値を指定出来ませんでした・・・・・

ちなみに、Enumの派生する型を指定できたりもするらしい。組み込み用でしょうか?

	enum Days : byte {Sun = 0, Mon, Tue, Wed, Thu, Fri, Sat};
bit演算

JavaではEnumをbit演算用として使用する場合、java.util.EnumSetを使うのが一般的でした。しかし、C#にはbit演算用のクラスは用意されていないようです。
で、どうするかというと、EnumにFlags(もしくはFlagsAttribute)という属性を付けてあげると.netはEnumをbitフラグで管理するようになり、普通のbit演算ができるようになります。

	class MainClass
	{
		public static void Main (string[] args)
		{
			Days d = Days.Sun | Days.Mon;
		}
	}

	[Flags]
	enum Days {Sun=1, Mon=2, Tue=4, Wed=8, Thu=16, Fri=32, Sat=64}; //値を指定してあげる

すでに定義されているEnumを使用する場合、Enum側を修正しないとbit演算で使用できないというのはちょっとよろしくないかなぁ。
EnumSetぐらいなら実装してしまうのが良いのかもしれない。

Enumへのメソッドの実装

できません。( ー`дー´)キリッ
ので、拡張メソッドを使用します。

Enumへの値の登録

Javaではコンストラクタを使ってあーだこーだしていたあれ、C#ではJavaのように簡単にはできません。
なので、アトリビュートを使ってあげるか拡張メソッドを使用するのが良いらしい。

Enumに関してはJavaの方が後から実装されただけあって使いやすいですね。