web-dev-qa-db-fra.com

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 converti enum en int ou int en enum.

Existe-t-il une différence dans ces conversions (performances, autres)? Ou sont-ils exactement les mêmes?

Merci.

P.S. Dans l'exemple actuel, je compare à «nombre magique», mais dans l'application réelle, j'obtiens des données du champ entier de DB.

36
Budda

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?

9
Melllvar

Je recommanderais de transtyper l'int à la valeur représentative enum lorsque vous le lisez dans 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)
{
   ...
}
6
Sam Trost

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  
4
David Rogers

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

4
Daniel A. White

Les énumérations dans .Net sont vraiment de jolies méta-structures sur le type intégral de base. (Par défaut, ce type est int.) Si vous regardez l'IL généré pour une énumération, vous constaterez qu'il s'agit en réalité d'un type standard avec plusieurs champs statiques pour chacun des éléments d'énumération particuliers. En tant que tel, l'énumération peut être transposée de manière transparente entre les types intégraux. 

Réponse associée

1
Matthew Whited

Cela peut aider.

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