Подтвердить что ты не робот

Использование GetHashCode для получения значения Enum int

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

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(). Есть ли проблемы с использованием этого?

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

Ответ 5

Другие говорили, что лучше использовать отливку для int.

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

Ответ 6

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

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

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

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

Ответ 7

Я вижу некоторые комментарии, которые описывают недостатки использования 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 из перечисления