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。在当前示例中,我比较'魔术数',但在实际应用中,我从数据库的整数字段获取数据。
答案 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的枚举,您会发现它实际上是一个标准类型,每个特定枚举元素都有几个静态字段。因此,枚举可以透明地在整数类型之间转换。