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.
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?
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)
{
...
}
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
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.
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.
Cela peut aider.
var constant = 1;
if(constant == (int)MyEnum.Valid1){
......
}