C# enum型の注意

2020年3月23日

どうもmrです!

皆さんはenum型を利用していますか?

ある程度、プログラミングしているととてもお世話になると思います

enum型とは列挙型と呼ばれ、複数の定数(列挙子)を1つのデータ型とすることができるものです。

はい、全くよくわかりませんねw

簡単に言うと、「リンゴ、バナナ、スイカ」と定義すると
自動的に「リンゴ = 0、バナナ = 1、スイカ = 2」と数字が割り振られます。

実際のプログラムはこんな感じです

すると、あなたがもし配列に果物の個数を入れていて、
添字に果物の名前を使っていたとすると、
上記のようにenum型で果物の名前を定義しておけば、
fruits[リンゴ]といったアクセスの仕方が可能になります。

しかも、上のenum型の最後に「個数」とか定義しておけばfor文でループさせるのも楽だったりします

「リンゴ、バナナ、スイカ、個数」


しかし、enumには1つ落とし穴があります。

それは列挙子を簡単には文字列として扱えないことです。

今まで一般的に知られている方法としては2つあります。
1. Enum.GetNameを使った方法
2. ToStringを使う方法
これらはリフレクションを使っているので、とても遅い処理となります。

なので、それらを回避するためにこちらのような拡張メソッドを作るパターンがよく知られていました。

しかしC#6の新機能であるnameof演算子を使えばこの問題は簡単に解決します。


とするだけで、 文字列の“バナナ“と同じ扱いになります。

さらにこれはコンパイル時に文字列として解釈されるので、実行時の速度には影響しないのです。

なので、バナナはn個ありますと画面に表示したいときは、

とか

ではなく


と書くのが無難です。

ちなみに僕はバナナは苦手です。



mr