如何比较枚举和int值?

时间:2011-03-11 17:17:36

标签: c# .net 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

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

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

感谢。

P.S。在当前示例中,我比较'魔术数',但在实际应用中,我从数据库的整数字段获取数据。

6 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:6)

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

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

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

答案 2 :(得分:4)

我会选择第二种方法。对我而言,它更符合逻辑。 如果i2超出范围,它将消除运行时异常。

答案 3 :(得分:4)

它们完全一样。使用Debug,Windows,Disassembly(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  

答案 4 :(得分:3)

这可以提供帮助。

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

答案 5 :(得分:1)

.Net中的枚举实际上只是基本整数类型的漂亮元结构。 (默认情况下,该类型为int。)如果您查看Generated IL的枚举,您会发现它实际上是一个标准类型,每个特定枚举元素都有几个静态字段。因此,枚举可以透明地在整数类型之间转换。

Related answer

相关问题