2011-01-03 16 views
17

Mam enumKorzystanie GetHashCode uzyskania Enum int wartość

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

muszę korzystać z tego wyliczenia dla seraching w kolumnach siatki

Aby uzyskać indeks kolumny używam

MyEnumVariable.GetHashCode() 

Co działa dobrze, czy powinienem użyć:

(short)MyEnumVariable 

Jestem nieco mylić za pomocą GetHashCode(). Czy jest jakiś problem z korzystaniem z tego.

Odpowiedz

36

Korzystanie GetHashCode() jest nieprawidłowy. Powinieneś rzucić na int. Używanie go w taki sposób, w jaki robisz, polega na tym, aby poprosić o ptaki drapieżne (lub Raymonda), by cię przygarnęły.

To, że GetHashCode() zwraca wartość całkowitą wyliczenia, jest szczegółem implementacji i może ulec zmianie w przyszłych wersjach .net.

GetHashCode() gwarantuje, że jeśli dwie wartości to equal, ich kody skrótu są również takie same. Odwrotnie nie jest gwarantowane.

Moja zasada jest taka, że ​​jeśli GetHashCode miały powrócić stałą wartość Twój program powinien nadal działać poprawnie (ale potencjalnie znacznie wolniej) od stałej GetHashCode trywialnie realizuje kontrakt, ale ma złe właściwości dystrybucji.

+0

@Alex Nie mam pojęcia, co chcesz powiedzieć z edycją. Pytanie dotyczy użycia 'GetHashCode' w celu uzyskania wartości liczbowej wyliczenia. – CodesInChaos

2

Powinieneś użyć (int) MyEnumVariable. Wszystkie wyliczenia domyślnie są dziedziczone po int.

+0

Wszelkie poważne problemy w korzystaniu GetHashCode() – Mohit

+2

myślę Dziedziczenie nie jest odpowiednie słowo tutaj. – CodesInChaos

+0

@CodeInChaos Mam na myśli, że enum MyEnum {} jest równe enum MyEnum: int {} –

5

Należy użyć (int)MyEnumVariable uzyskania wartości dosłowne ... można również konwertować w inny sposób jak (INFLOW_SEARCH_ON)int

1

Dostępne są również metody opcji dostępne w klasie statycznej Enum. Na przykład:

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

Jeśli wszystko, co próbujesz zrobić, to uzyskaj wartość Enum. Możesz uzyskać ciąg ValueType, np. "ON_ENTITY_HANDLE" z Enum.GetName(...).

W innym przypadku rzutowanie na (int) byłoby zdecydowanie preferowane w stosunku do GetHashCode().

2

Po wykonaniu profilowania Enum.GetHashCode wykonano wiele cykli. Udało mi się to poprawić, używając (en) Enum tam, gdzie to możliwe.

2

Inni powiedzieli, dlaczego lepsze jest odlewanie do int.

Innym powodem, dla którego nie należy używać GetHashCode jest performance. It causes boxing. W moich szybkich testach, GetHashCode było około 50 razy wolniejsze (jeśli ma to znaczenie).

1

Widzę komentarze, które opisują wady używania GetHashCode() z wielu powodów.

Istnieje kilka przypadków, w których (int) INFLOW_SEARCH_ON.ON_LABEL nie działa.

Dobrym sposobem na uzyskanie wartości int z Enum jest użycie metody GeTTypeCode(). Ta metoda działa niezależnie od typu podstawowego. W tym przypadku jest to 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); 

Dane wyjściowe w tym przypadku to "1".

referencyjny: Get int value from enum

+0

W tym przypadku typ wyliczeniowy jest znany w czasie kompilacji i nie należy oczekiwać, że podstawowy typ wyliczenia będzie się zmieniać w czasie; więc możesz po prostu rzucić enum na dowolny typ bazowy, który w tym przypadku jest "int". Gdyby było, powiedzmy, "długie", to po prostu chciałbyś statycznie rzucić na to. – Servy