web-dev-qa-db-ja.com

enum値とint値を比較する方法は?

enum MyEnum
{
    Invalid=0,
    Value1=1,
    Value1=2,
}

void main ()
{
    MyEnum e1 = MyEnum.Value1;
    int i1 = 2;

    // Is there any difference how to compare enumEration values with integers?
    if ( e1==(MyEnum)i1 )... // 1st

    if ( (int)e1==i1 )... // 2nd

上記の各ケースでは、enumからintまたはintからenumに変換します。

これらの変換(パフォーマンス、その他)に違いはありますか?それともまったく同じですか?

ありがとう。

追伸現在の例では「マジックナンバー」と比較していますが、実際のアプリケーションではDBの整数フィールドからデータを取得しています。

39
Budda

どちらを使用しても問題ありません。同じように機能します。整数値の列挙が存在しない場合、.netは実行時に列挙を作成します。例外はありません。

ただし、Xichen Liは正しいです-列挙型を整数値と比較したいのはなぜですか?

10
Melllvar

データベースから読み取った場合、intを代表的な列挙値にキャストすることをお勧めします。これにより、コードの可読性が大幅に向上します。

enum MyEnum
{
    Invalid=0,
    Value1=1,
    Value1=2,
}

MyEnum dbValue = ReadEnumFromDB();
if(dbValue == MyEnum.Invalid)
{
   ...
}
6
Sam Trost

それらはまったく同じです。デバッグ、Windows、逆アセンブリ(Ctrl-Alt-D)を使用して生成されたILを表示すると、次のことができます。

MyEnum e1 = MyEnum.Value1;
00260834  mov         dword ptr [ebp-3Ch],1  
int i1 = 2;
0026083B  mov         dword ptr [ebp-40h],2  

// Is there any difference how to compare enumEration values with integers?
if (e1 == (MyEnum) i1) 
00260842  mov         eax,dword ptr [ebp-3Ch]  
00260845  cmp         eax,dword ptr [ebp-40h]  
00260848  sete        al  
0026084B  movzx       eax,al  
0026084E  mov         dword ptr [ebp-44h],eax  
00260851  cmp         dword ptr [ebp-44h],0  
00260855  je          00260858  
; // 1st
00260857  nop  

if ((int)e1 == i1)
00260858  mov         eax,dword ptr [ebp-3Ch]  
0026085B  cmp         eax,dword ptr [ebp-40h]  
0026085E  sete        al  
00260861  movzx       eax,al  
00260864  mov         dword ptr [ebp-48h],eax  
00260867  cmp         dword ptr [ebp-48h],0  
0026086B  je          0026086E  
; // 2nd
0026086D  nop  
5
David Rogers

私は2番目の方法で行きます。私にとっては、より理にかなっています。 i2が範囲外の場合、ランタイム例外を排除します。

4
Daniel A. White

これが役立ちます。

var constant = 1;
if(constant == (int)MyEnum.Valid1){
......
}
3
Vivek kumar

.Netの列挙は、実際には基本的な整数型の単なるメタ構造です。 (デフォルトでは、その型はintです。)列挙型の生成されたILを見ると、特定の列挙型要素ごとにいくつかの静的フィールドを持つ実際の標準型であることがわかります。そのため、列挙型は整数型間で透過的にキャストできます。

関連する回答

1
Matthew Whited