2011-01-03 24 views
17

tengo una enumeraciónUsando GetHashCode para obtener el valor de enumeración int

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 unas columnas de la cuadrícula

Para obtener el índice de la columna que estoy usando

MyEnumVariable.GetHashCode() 

que trabaja bien, o debería utilizar

(short)MyEnumVariable 

Estoy un poco confundido sobre el uso de GetHashCode(). ¿Hay algún problema al usar eso?

Respuesta

36

usando GetHashCode() es incorrecto. Deberías enviar a int. Usarlo de la manera en que lo haces es pedir que las aves rapaces (o Raymond) vengan y te coman.

Eso GetHashCode() da como resultado que el valor entero de la enumeración es un detalle de implementación y puede cambiar en las versiones futuras de .net.

GetHashCode() garantiza que si dos valores son equal sus códigos de hash son iguales también. Al revés, no está garantizado.

Mi regla de oro es que si tuviera que volver GetHashCode un valor constante su programa debería funcionar correctamente (pero potencialmente ser mucho más lento) ya una constante GetHashCode cumple trivialmente el contrato, pero tiene malas propiedades de distribución.

+0

@Alex No tengo idea de qué quieres decir con la edición. La pregunta es acerca de usar 'GetHashCode' para obtener el valor numérico de una enumeración. – CodesInChaos

2

Debe usar (int) MyEnumVariable. Todas las enumeraciones por defecto se heredan de int.

+0

Cualquier graves problemas en el uso de GetHashCode() – Mohit

+2

creo que hereda no es la palabra correcta aquí. – CodesInChaos

+0

@CodeInChaos Quiero decir que enum MyEnum {} es igual a enum MyEnum: int {} –

5

Debe utilizar (int)MyEnumVariable para obtener el valor literal ... También puede convertir a la inversa como (INFLOW_SEARCH_ON)int

1

También tiene los métodos de opción proporcionados por la clase Enum static. Por ejemplo:

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

Si todo lo que intenta hacer es obtener el valor de Enum. Puede obtener la cadena ValueType, p. Ej. "ON_ENTITY_HANDLE" con Enum.GetName(...).

De lo contrario, la conversión a (int) sería definitivamente preferible a GetHashCode().

2

Cuando hice perfiles, Enum.GetHashCode tomó muchos ciclos. Pude mejorarlo usando (int) Enum siempre que sea posible.

2

Otros han dicho por qué casting to int es mejor.

Otra razón para no usar GetHashCode es performance. It causes boxing. En mis pruebas rápidas, GetHashCode fue aproximadamente 50 veces más lenta (si es que importa).

1

Veo algunos comentarios que describen las desventajas de usar GetHashCode() por muchas razones.

Hay algunos casos donde (int) INFLOW_SEARCH_ON.ON_LABEL no funciona.

Una buena forma 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: Get int value from enum

+0

En este caso, el tipo de enumeración se conoce en tiempo de compilación, y no debe esperar que el tipo subyacente de una enumeración cambie con el tiempo; por lo que simplemente puede convertir la enumeración en el tipo subyacente, que en este caso es 'int'. Si fuera, por ejemplo, "largo", entonces simplemente querría transmitirlo estáticamente a eso. – Servy