c# - usar - Usando GetHashCode para obtener el valor int de Enum
pasar enum como parametro c# (7)
Tengo una enumeración
public enum INFLOW_SEARCH_ON
{
ON_ENTITY_HANDLE = 0,
ON_LABEL = 1,
ON_NODE_HANDLE = 2
} // enum INFLOW_SEARCH_ON
Tengo que usar esta enumeración para seraching en una cuadrícula columnas
Para obtener el índice de columna que estoy usando
MyEnumVariable.GetHashCode()
Que funciona bien, o debería usar
(short)MyEnumVariable
Estoy un poco confundido sobre el uso de GetHashCode (). ¿Hay algún problema con eso?
Cuando hice el perfilado, Enum.GetHashCode tomó muchos ciclos. Pude mejorarlo usando (int) Enum cuando sea posible.
Debe utilizar (int) MyEnumVariable
. Todas las enumeraciones por defecto son heredadas de int
.
Debería usar (int)MyEnumVariable
para obtener el valor literal ... también puede convertir la otra forma como (INFLOW_SEARCH_ON)int
Otros han dicho por qué el casting a int es mejor.
Otra razón para no usar GetHashCode
es el rendimiento. Causa el boxeo. En mis pruebas rápidas, GetHashCode
fue aproximadamente 50 veces más lento (si es que importa).
También tiene los métodos de opción proporcionados por la clase estática Enum. Por ejemplo:
Enum.TryParse<TEnum>(string ValueType, out TEnum Result)
Si todo lo que intenta hacer es obtener el valor del Enum. Puede obtener la cadena ValueType, por ejemplo, "ON_ENTITY_HANDLE" con Enum.GetName(...)
.
De lo contrario, la conversión a (int) definitivamente se preferiría a GetHashCode()
.
Usar GetHashCode()
es incorrecto Deberías lanzar a int
. Usarlo de la manera que lo haces es pedir que las rapaces (o Raymond) vengan y te coman.
Que GetHashCode()
devuelva el valor entero de la enumeración es un detalle de implementación y puede cambiar en versiones futuras de .net.
GetHashCode()
garantiza que si dos valores son equal
sus códigos hash también lo son. El revés no está garantizado.
Mi regla de oro es que si GetHashCode
devolviera un valor constante, su programa debería funcionar correctamente (pero potencialmente ser mucho más lento), ya que un GetHashCode
constante cumple el contrato de manera trivial, pero tiene propiedades de distribución erróneas.
Veo algunos comentarios que describen las desventajas de usar GetHashCode () por muchas razones.
Hay algunos casos en los que (int) INFLOW_SEARCH_ON.ON_LABEL no funciona.
Una buena manera de obtener el valor int de Enum es usar el método GeTTypeCode (). Este método funciona independientemente del tipo subyacente. En este caso 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);
La salida en este caso es ''1''.
Referencia: Obtener valor int de enum