如何比较枚举和int值?

Bud*_*dda 40 .net c# enums

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
Run Code Online (Sandbox Code Playgroud)

在每个提到的案例中,我们将enum转换为int或int转换为enum.

这些转换(性能,还是其他)有什么不同吗?或者他们是完全一样的?

谢谢.

PS在当前的例子中我比较'魔术数'但在实际应用中我从DB的整数字段获取数据.

小智 14

这可以提供帮助。

var constant = 1;
if(constant == (int)MyEnum.Valid1){
......
}
Run Code Online (Sandbox Code Playgroud)


Mel*_*var 11

你使用哪个并不重要,它们的表现相同.如果没有整数值的枚举,.net会在运行时创建一个.没有例外.

但是,Xichen Li是正确的 - 为什么要将枚举与整数值进行比较?

  • 如果某个值不存在,.NET不需要"创建"它.基本上,枚举值知道它是什么类型,但只包含相关整数的位.为什么需要创建任何东西? (5认同)
  • 关于。“为什么要将枚举与整数值进行比较?” 例如,枚举不是有效的 SQL 类型。 (3认同)
  • 好吧,它会返回"5"......但我仍然不会称这个过程"创造"一个新值.这就是ToString的表现,就是这样.转换中涉及的代码本身需要*no*来判断该值是否在枚举中定义. (2认同)
  • 我有一个用例.框架中定义的HttpStatusCode枚举.我想检查400以上的所有值,以特定的方式处理它们. (2认同)

Sam*_*ost 6

当您从数据库中读取int时,我建议将int转换为代表枚举值.这将大大提高代码的可读性.

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

MyEnum dbValue = ReadEnumFromDB();
if(dbValue == MyEnum.Invalid)
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

  • 如果该数据库列始终由MyEnum值正确表示,则在调试时,将更容易识别int应该表示的确切内容. (2认同)

Dav*_*ers 5

他们是完全一样的。使用“调试,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  
Run Code Online (Sandbox Code Playgroud)