Как сравнить значения enum и int?
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 для перечисления.
Есть ли разница в этих преобразованиях (производительность, любая другая)? Или они точно такие же?
Спасибо.
P.S. В текущем примере я сравниваю с "магическим числом", но в реальном приложении я получаю данные из целочисленного поля из БД.
Ответы
Ответ 1
Неважно, что вы используете, они будут выполняться одинаково. Если для целочисленного значения нет перечисления,.net создает его во время выполнения. Исключений не может быть.
Тем не менее, Xichen Li прав - почему вы хотите сравнить enum с целым значением?
Ответ 2
Я бы порекомендовал лить int значение представления enum при его чтении из базы данных. Это значительно улучшит читаемость вашего кода.
enum MyEnum
{
Invalid=0,
Value1=1,
Value1=2,
}
MyEnum dbValue = ReadEnumFromDB();
if(dbValue == MyEnum.Invalid)
{
...
}
Ответ 3
Я бы пошел со вторым методом. Для меня это имеет более логичный смысл. Это исключает исключения во время выполнения, если i2
вне диапазона.
Ответ 4
Они точно такие же. Отображение сгенерированного IL с помощью Debug, Windows, Disassembly (Ctrl-Alt-D) дает вам:
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
Ответ 5
Перечисления в .Net - это действительно просто мета-структуры над базовым интегральным типом. (По умолчанию этот тип является int.) Если вы посмотрите на Generated IL для перечисления, вы обнаружите, что это действительно стандартный тип с несколькими статическими полями для каждого из конкретных элементов перечисления. Таким образом, перечисление может быть трансформировано между целыми типами прозрачно.
Связанный ответ