Подтвердить что ты не робот

Как сравнить значения 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. В текущем примере я сравниваю с "магическим числом", но в реальном приложении я получаю данные из целочисленного поля из БД.

4b9b3361

Ответ 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 для перечисления, вы обнаружите, что это действительно стандартный тип с несколькими статическими полями для каждого из конкретных элементов перечисления. Таким образом, перечисление может быть трансформировано между целыми типами прозрачно.

Связанный ответ