.net 如何比较枚举值和整型值?

fzwojiic  于 2023-01-22  发布在  .NET
关注(0)|答案(7)|浏览(128)
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

在上面提到的每一种情况下,我们都有枚举到int或int到枚举的转换。
这些转换(性能,任何其他)有什么不同吗?或者它们完全相同?
谢谢。
注:在当前示例中,我比较"幻数",但在实际应用中,我从数据库的整型字段中获取数据。

wqlqzqxt

wqlqzqxt1#

这能帮上忙。

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

ftf50wuq2#

不管你使用哪一个,它们的执行都是一样的。如果没有整数值的枚举,.net会在运行时创建一个。不可能有例外。
然而,李希晨是正确的--为什么要比较枚举和整数值?

hgncfbus

hgncfbus3#

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

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

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

91zkwejq4#

它们是完全相同的。使用“调试”、“窗口”、“反汇编”(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
mmvthczy

mmvthczy5#

我会选择第二种方法。对我来说,它更有逻辑意义。如果i2超出范围,它将消除运行时异常。

6pp0gazn

6pp0gazn6#

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

hl0ma9xz

hl0ma9xz7#

也许您可以将枚举声明为一个静态类,所有可能的值都是静态整型

public static class myEnum{
public static int myInt = 1;
public static int myInt2 = 2;
}

Then compare them directly
int myComparedVar = 2;
if(myComparedVar == myEnum.myInt){...}

相关问题