Использование GetHashCode для получения значения Enum int - PullRequest
22 голосов
/ 03 января 2011

У меня есть перечисление

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

Я должен использовать это перечисление для поиска в столбцах сетки

Чтобы получить индекс столбца, я использую

  MyEnumVariable.GetHashCode() 

Что работает нормально, или я должен использовать

  (short)MyEnumVariable

Я немного запутался из-за использования GetHashCode ().Есть ли проблемы с этим.

Ответы [ 7 ]

47 голосов
/ 03 января 2011

Использование GetHashCode() неверно. Вы должны привести к int. Чтобы использовать его, вы просите, чтобы хищники (или Раймонд) пришли и съели вас.

То, что GetHashCode() возвращает целочисленное значение перечисления, является подробностью реализации и может измениться в будущих версиях .net.

GetHashCode() гарантирует, что если два значения равны equal, то их хэш-коды также равны. Обратный путь не гарантирован.

Мое эмпирическое правило заключается в том, что если бы GetHashCode вернул постоянное значение, ваша программа все равно должна работать правильно (но потенциально может быть намного медленнее), поскольку константа GetHashCode тривиально выполняет контракт, но имеет плохие свойства распределения.

4 голосов
/ 03 января 2011

Вы должны использовать (int)MyEnumVariable для получения буквального значения ... вы также можете конвертировать другим способом, например (INFLOW_SEARCH_ON)int

2 голосов
/ 05 февраля 2013

Когда я делал профилирование, Enum.GetHashCode занимал много циклов.Я смог улучшить его, используя (int) Enum, где это возможно.

1 голос
/ 11 июня 2013

Другие говорят, что приведение к int лучше.

Другая причина не использовать GetHashCode - производительность .Это вызывает бокс. В моих быстрых тестах GetHashCode был примерно в 50 раз медленнее (если это имеет значение).

1 голос
/ 03 января 2011

Вы должны использовать (int) MyEnumVariable.Все перечисления по умолчанию наследуются от int.

0 голосов
/ 26 августа 2014

Я вижу некоторые комментарии, которые описывают недостатки использования GetHashCode () по многим причинам.

В некоторых случаях (int) INFLOW_SEARCH_ON.ON_LABEL не работает.

Хороший способ получить значение int из Enum - использовать метод GeTTypeCode ().Этот метод работает независимо от базового типа.В этом случае это 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);

Выходные данные в этом случае '1'.

Ссылка: Получить значение int из enum

0 голосов
/ 03 января 2011

У вас также есть методы option, предоставляемые статическим классом Enum. Например:

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

Если все, что вы пытаетесь сделать, это получить значение Enum. Вы можете получить строку ValueType, например, "ON_ENTITY_HANDLE" с Enum.GetName(...).

В противном случае приведение к (int) определенно предпочтительнее GetHashCode().

...