Q:

Enumは== か Equals かどちらで判定すべきでしょうか？

Unityでゲーム開発をしており、言語はC#を使用しています。
表題の件、現場で議論したのですが
どちらが良いのか答えを見つけられませんでした。
下記MSDNのページを見たところ
https://msdn.microsoft.com/ja-jp/library/sbbt4032.aspx
"既定では、最初の列挙子の値は 0 で、後続の列挙子の値は 1 ずつ増加していきます。"
とあるので値として==で比較するべきだと思っているのですが、
Equalsでも判定して正しい結果を得る事ができるので
用意されているメソッドで判定すべきではないかとの意見もあり、
結局どっちで比較するのが正しいのかという問題となりました。
どちらで判定すべきか理由が欲しいのですが
ご教授いただけませんでしょうか？
■開発環境
Windows7
Unity5.3.0f4

A:

等値演算子”==”を使用すべきだと考えます。
理由は、Equalsメソッド利用した場合、対象となる引数objはobject型となるので、ボックス化が必須となります。これはマネージヒープに本来不要な列挙型の値を展開することになり、ガーベージコレクタにインパクトを与えることになります。(とはいえその影響は微少なものにとどまるとは思いますが）
また、Equalsメソッドを呼び出すオーバーヘッドもパフォーマンスにインパクトを与える可能性があります。
他方、等値演算子"=="を使用した場合は、基になる型（明示無き場合はSystem.Int32)の比較となりますから、マネージヒープを利用することはありませんし、又比較も単純なceq命令になります。
以上のことから、高頻度で比較が発生する場合に特に大きな差が発生しかねない点と、可読性の点から見ても問題は無いかと思いますので、等値演算子"=="を利用すべきだと考えます。

A:

どちらでもいいかと思いますけど
両者の違いというと、例えば
enum Colors { Red, Green, Blue, Yellow };
enum Pet { Cat, Dog, Horse, Dolphin };

のような二つの列挙型があるときRed と Cat は既定ではint32の０を意味するというようなことになるわけですが、
Pet myPet = Pet.Cat;
Colors myColor = Colors.Red;

if(myColor == myPet){//数値としての値は同じ？
    ...
}

のようなことはコンパイルエラー(両者の型が異なる)になるのでできません。
しかし、
if(myColor.Equals(myPet)){//オブジェクトとしてなのでコンパイルは通るが違う型なのでもちろん結果はFalse
    ...
}

はできます。
なので(時計屋さんと同じくコストパフォーマンスの点から)、同じ列挙型で比較する場合には単に==を使えばいいと思います。
逆に言えば相手先の型がわからない（同じ列挙型かもしれないし違うかもしれない）ような状況での等値判定であればEqualsを使うのかなと思います。

