52 votes

Comment comparer les valeurs enum et 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

Dans chacun des cas mentionnés, nous avons la conversion de enum en int ou int en enum.

Y a-t-il une différence dans ces conversions (performance, autre) ? Ou ce sont exactement les mêmes ?

Merci.

PS Dans l'exemple actuel, je compare au «nombre magique», mais dans l'application réelle, j'obtiens des données du champ entier de la base de données.

14voto

Melllvar Points 813

Peu importe ce que vous utilisez, ils fonctionneront de manière identique. S'il n'y a pas d'énumération pour une valeur entière, .net en crée une au moment de l'exécution. Il ne peut y avoir aucune exception.

Cependant, Xichen Li a raison - pourquoi voudriez-vous comparer une énumération à une valeur entière ?

13voto

Vivek kumar Points 141

Cela peut aider.

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

6voto

Bananamansam Points 1448

Je recommanderais de convertir l'int à la valeur enum représentative lorsque vous le lisez à partir de la base de données. Cela améliorera grandement la lisibilité de votre code.

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

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

6voto

anyoneis Points 347

Ils sont exactement les mêmes. L'affichage de l'IL généré à l'aide de Debug, Windows, Disassembly (Ctrl-Alt-D) vous donne :

 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  

4voto

Daniel A. White Points 91889

J'irais avec la 2ème méthode. Pour moi, c'est plus logique. Cela éliminerait les exceptions d'exécution si i2 est hors limites.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X