2011-01-03 9 views
17

Ich habe eine ENUMGetHashCode Verwendung für Enum int Wert bekommen

public enum INFLOW_SEARCH_ON 
{ 
    ON_ENTITY_HANDLE = 0,   
    ON_LABEL = 1,     
    ON_NODE_HANDLE = 2    
} // enum INFLOW_SEARCH_ON 

Ich habe diese Enumeration verwenden für in einem Rasterspalten seraching

Um den Spaltenindex bekomme ich

MyEnumVariable.GetHashCode() 
bin mit

Welche ok funktioniert, oder sollte ich

(short)MyEnumVariable 
verwenden

Ich bin etwas verwirrt über GetHashCode(). Gibt es ein Problem damit?

Antwort

36

konvertieren Mit GetHashCode() falsch ist. Sie sollten in int umwandeln. So wie du es tust, verlangst du von Raptoren (oder Raymond), dich zu essen.

Das GetHashCode() passiert, den Integer-Wert der Enumeration zurückzugeben, ist ein Implementierungsdetail und kann sich in zukünftigen Versionen von .net ändern.

GetHashCode() garantiert, dass, wenn zwei Werte equal sind ihre Hash-Codes auch gleich sind. Der umgekehrte Weg ist nicht garantiert.

Meine Faustregel ist, dass wenn GetHashCode einen konstanten Wert Ihr Programm zurückzukehren waren noch richtig funktionieren sollte (aber möglicherweise viel langsamer sein), da eine konstante GetHashCode trivialer den Vertrag erfüllt, hat aber schlechte Verteilungseigenschaften.

+0

@Alex Ich habe keine Ahnung, was Sie mit der Bearbeitung sagen wollen. Die Frage bezieht sich auf die Verwendung von 'GetHashCode', um den numerischen Wert einer Enumeration zu erhalten. – CodesInChaos

2

Sie sollten (int) MyEnumVariable verwenden. Alle Enums sind standardmäßig von int geerbt.

+0

Jede schwere Probleme in GetHashCode() verwendet – Mohit

+2

Ich denke, vererben ist hier nicht das richtige Wort. – CodesInChaos

+0

@CodeInChaos Ich meine, dass enum MyEnum {} ist gleich enum MyEnum: int {} –

5

Sie (int)MyEnumVariable für das Erhalten des Literalwert verwenden sollte ... Sie können auch die andere Art und Weise wie (INFLOW_SEARCH_ON)int

1

Sie haben auch die Optionsmethoden, die von der statischen Klasse Enum bereitgestellt werden. Beispiel:

Enum.TryParse<TEnum>(string ValueType, out TEnum Result) 

Wenn Sie nur versuchen, den Wert der Enum zu erhalten. Sie können die Zeichenfolge ValueType z. "ON_ENTITY_HANDLE" mit Enum.GetName(...).

Andernfalls würde Casting zu (Int) definitiv gegenüber GetHashCode() bevorzugt werden.

2

Wenn ich Profiling gemacht habe, nahm Enum.GetHashCode eine Menge Zyklen. Ich konnte es verbessern, indem ich (int) Enum verwendete, wo es möglich war.

2

Andere haben gesagt, warum Casting zu Int besser ist.

Ein weiterer Grund nicht zu verwenden GetHashCode ist performance. It causes boxing. In meinen Schnelltests war GetHashCode etwa 50 mal langsamer (wenn es darauf ankommt).

1

Ich sehe einige Kommentare, die die Nachteile der Verwendung von GetHashCode() aus vielen Gründen beschreiben.

Es gibt einige Fälle, in denen (int) INFLOW_SEARCH_ON.ON_LABEL nicht funktioniert.

Eine gute Möglichkeit, den Int-Wert von Enum zu erhalten, ist die GeTTypeCode() -Methode. Diese Methode funktioniert unabhängig vom zugrunde liegenden Typ. In diesem Fall ist es int.

public enum INFLOW_SEARCH_ON 
{ 
ON_ENTITY_HANDLE = 0,   
ON_LABEL = 1,     
ON_NODE_HANDLE = 2    
} // enum INFLOW_SEARCH_ON 

INFLOW_SEARCH_ON selectedType = INFLOW_SEARCH_ON.ON_LABEL; 

object val = Convert.ChangeType(selectedType, selectedType.GetTypeCode()); 
Console.WriteLine(val); 

Ausgabe ist in diesem Fall '1'.

Referenz: Get int value from enum

+0

In diesem Fall ist der Aufzählungstyp zum Zeitpunkt der Kompilierung bekannt, und Sie sollten nicht erwarten, dass sich der zugrunde liegende Typ einer Aufzählung im Laufe der Zeit ändert. Sie können also die Enumeration einfach auf den zugrunde liegenden Typ anwenden, der in diesem Fall "int" ist. Wäre es, sagen wir, "lang", dann würdest du es einfach statisch ansprechen wollen. – Servy