20969


Unityでゲーム開発をしており、言語はC#を使用しています。

表題の件、現場で議論したのですが  
どちらが良いのか答えを見つけられませんでした。

下記MSDNのページを見たところ  
<https://msdn.microsoft.com/ja-jp/library/sbbt4032.aspx>  
"既定では、最初の列挙子の値は 0 で、後続の列挙子の値は 1 ずつ増加していきます。"  
とあるので値として==で比較するべきだと思っているのですが、  
Equalsでも判定して正しい結果を得る事ができるので  
用意されているメソッドで判定すべきではないかとの意見もあり、  
結局どっちで比較するのが正しいのかという問題となりました。

どちらで判定すべきか理由が欲しいのですが  
ご教授いただけませんでしょうか？

■開発環境  
Windows7  
Unity5.3.0f4


CC BY-SA 3.0
2016-01-16T06:12:11.677
20967
2016-01-16T09:12:06.380
2016-01-16T09:12:06.380
76
5261
question
c#
Enumは== か Equals かどちらで判定すべきでしょうか？


等値演算子”==”を使用すべきだと考えます。

理由は、Equalsメソッド利用した場合、対象となる引数objはobject型となるので、ボックス化が必須となります。これはマネージヒープに本来不要な列挙型の値を展開することになり、ガーベージコレクタにインパクトを与えることになります。(とはいえその影響は微少なものにとどまるとは思いますが）

また、Equalsメソッドを呼び出すオーバーヘッドもパフォーマンスにインパクトを与える可能性があります。  
他方、等値演算子"=="を使用した場合は、基になる型（明示無き場合はSystem.Int32)の比較となりますから、マネージヒープを利用することはありませんし、又比較も単純なceq命令になります。

以上のことから、高頻度で比較が発生する場合に特に大きな差が発生しかねない点と、可読性の点から見ても問題は無いかと思いますので、等値演算子"=="を利用すべきだと考えます。


CC BY-SA 3.0
2016-01-16T06:46:44.123
20969
2016-01-16T07:17:07.240
2016-01-16T07:17:07.240
7287
7287
20967
answer


enum型を比較するのであれば、個人的には==ではないかと思いますが、Equals()でも同じ結果になりますよね。理由は値型を比較しているからです。ただ、やみくもになんでもEquals()を使うというのは危険かなと思います。

Equals()はオブジェクト同士を比較するので、値型と参照型では==とは結果が異なることがある、という点を理解して使用するのであれば、チーム内の意志を尊重する、というのもアリかと思います。


CC BY-SA 3.0
2016-01-16T06:49:25.770
20970
2016-01-16T06:49:25.770
9515
20967
answer


どちらでもいいかと思いますけど

両者の違いというと、例えば

[code]

    enum Colors { Red, Green, Blue, Yellow };
    enum Pet { Cat, Dog, Horse, Dolphin };
    
[/code]

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

[code]

    Pet myPet = Pet.Cat;
    Colors myColor = Colors.Red;
    
    if(myColor == myPet){//数値としての値は同じ？
        ...
    }
    
[/code]

のようなことはコンパイルエラー(両者の型が異なる)になるのでできません。  
しかし、

[code]

    if(myColor.Equals(myPet)){//オブジェクトとしてなのでコンパイルは通るが違う型なのでもちろん結果はFalse
        ...
    }
    
[/code]

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


CC BY-SA 3.0
2016-01-16T06:50:03.047
20971
2016-01-16T07:12:28.013
2016-01-16T07:12:28.013
5044
5044
20967
answer