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の整数フィールドからデータを取得しています。
どちらを使用しても問題ありません。同じように機能します。整数値の列挙が存在しない場合、.netは実行時に列挙を作成します。例外はありません。
ただし、Xichen Liは正しいです-列挙型を整数値と比較したいのはなぜですか?
データベースから読み取った場合、intを代表的な列挙値にキャストすることをお勧めします。これにより、コードの可読性が大幅に向上します。
enum MyEnum
{
Invalid=0,
Value1=1,
Value1=2,
}
MyEnum dbValue = ReadEnumFromDB();
if(dbValue == MyEnum.Invalid)
{
...
}
それらはまったく同じです。デバッグ、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
私は2番目の方法で行きます。私にとっては、より理にかなっています。 i2
が範囲外の場合、ランタイム例外を排除します。
これが役立ちます。
var constant = 1;
if(constant == (int)MyEnum.Valid1){
......
}
.Netの列挙は、実際には基本的な整数型の単なるメタ構造です。 (デフォルトでは、その型はintです。)列挙型の生成されたILを見ると、特定の列挙型要素ごとにいくつかの静的フィールドを持つ実際の標準型であることがわかります。そのため、列挙型は整数型間で透過的にキャストできます。