Как сравнить значения enum и int? - PullRequest
38 голосов
/ 11 марта 2011
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.

Есть ли разница в этих преобразованиях (производительность, любая другая)?Или они точно такие же?

Спасибо.

PS В текущем примере я сравниваю с «магическим числом», но в реальном приложении я получаю данные из целочисленного поля из БД.

Ответы [ 6 ]

9 голосов
/ 11 марта 2011

Неважно, какой вы используете, они будут работать одинаково.Если для целочисленного значения нет перечисления, .net создает его во время выполнения.Не может быть никаких исключений.

Тем не менее, Сичен Ли прав - зачем вам сравнивать перечисление с целочисленным значением?

6 голосов
/ 11 марта 2011

Я бы рекомендовал привести int к представительному значению enum, когда вы читаете его из базы данных.Это значительно улучшит читабельность вашего кода.

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

MyEnum dbValue = ReadEnumFromDB();
if(dbValue == MyEnum.Invalid)
{
   ...
}
5 голосов
/ 30 марта 2017

Они точно такие же.Отображение сгенерированного 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  
4 голосов
/ 11 марта 2011

Я бы пошел со 2-м методом.Для меня это имеет более логичный смысл. Это исключит исключения времени выполнения, если i2 находится вне диапазона.

3 голосов
/ 01 мая 2018

Это может помочь.

var constant = 1;
if(constant == (int)MyEnum.Valid1){
......
}
1 голос
/ 11 марта 2011

Перечисления в .Net на самом деле являются просто симпатичными мета-структурами базового целочисленного типа.(По умолчанию этот тип - int.) Если вы посмотрите на сгенерированный IL для перечисления, вы обнаружите, что это действительно стандартный тип с несколькими статическими полями для каждого из конкретных элементов перечисления.Таким образом, перечисление может быть прозрачно приведено между целочисленными типами.

Аналогичный ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...