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