web-dev-qa-db-de.com

Wie werden Enumerations- und Int-Werte verglichen?

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

In jedem der genannten Fälle haben wir die Umwandlung von enum in int oder int in enum.

Gibt es Unterschiede bei diesen Konvertierungen (Leistung, andere)? Oder sind sie genau gleich?

Vielen Dank.

P.S. Im aktuellen Beispiel vergleiche ich die 'magische Zahl', aber in der realen Anwendung erhalte ich Daten aus einem ganzzahligen Feld aus der DB.

36
Budda

Es ist egal, was Sie verwenden, sie werden identisch funktionieren. Wenn für einen ganzzahligen Wert keine Aufzählung vorhanden ist, erstellt .net zur Laufzeit ein Enum. Es kann keine Ausnahmen geben.

Allerdings ist Xichen Li richtig - warum möchten Sie eine Aufzählung mit einem ganzzahligen Wert vergleichen?

9
Melllvar

Ich würde empfehlen, das int auf den repräsentativen Aufzählungswert umzustellen, wenn Sie es aus der Datenbank lesen. Dadurch wird die Lesbarkeit Ihres Codes erheblich verbessert.

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

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

Sie sind genau das Gleiche. Wenn Sie die generierte AWL mit Hilfe von Debugging, Windows, Disassembly (Strg-Alt-D) anzeigen, erhalten Sie Folgendes:

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

Ich würde mit der 2. Methode gehen. Für mich macht es logischeren Sinn. Es würde Laufzeitausnahmen beseitigen, wenn i2 außerhalb des gültigen Bereichs liegt.

4
Daniel A. White

Enumerationen in .Net sind eigentlich nur hübsche Meta-Strukturen über dem Basisintegral-Typ. (Standardmäßig ist dieser Typ int.) Wenn Sie die generierte AWL nach einer Aufzählung betrachten, werden Sie feststellen, dass es sich tatsächlich um einen Standardtyp mit mehreren statischen Feldern für jedes einzelne Aufzählungselement handelt. Daher kann die Aufzählung transparent zwischen integralen Typen gegossen werden. 

Verwandte Antwort

1
Matthew Whited

Das kann helfen.

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