使用GetHashCode获取Enum int值

时间:2011-01-03 13:01:33

标签: c# enums gethashcode

我有一个枚举

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 个答案:

答案 0 :(得分:46)

使用GetHashCode()不正确。你应该转为int。以你的方式使用它是要求猛禽(或雷蒙德)来吃你。

GetHashCode()恰好返回枚举的整数值是一个实现细节,可能会在.net的未来版本中更改。

GetHashCode()保证如果两个值为equal,则它们的哈希码也相等。反过来并不能保证。

我的经验法则是,如果GetHashCode返回一个常量值,程序应该仍能正常工作(但可能很多更慢)因为常量GetHashCode履行合同,但分配属性不好。

答案 1 :(得分:4)

您应该使用(int)MyEnumVariable来获取字面值...您还可以转换其他方式,例如(INFLOW_SEARCH_ON)int

答案 2 :(得分:2)

当我进行分析时,Enum.GetHashCode花了很多周期。我可以在可能的情况下使用(int)Enum来改进它。

答案 3 :(得分:1)

您应该使用(int) MyEnumVariable。默认情况下,所有枚举都继承自int

答案 4 :(得分:1)

其他人已经说过为什么转换为int更好。

不使用GetHashCode的另一个原因是performance. It causes boxing.在我的快速测试中,GetHashCode的速度慢了约50倍(如果重要的话)。

答案 5 :(得分:0)

您还拥有Enum静态类提供的选项方法。例如:

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

如果您要做的就是获取Enum的值。您可以获取字符串ValueType,例如带有Enum.GetName(...)的“ON_ENTITY_HANDLE”。

否则,转换为(int)绝对优先于GetHashCode()

答案 6 :(得分:0)

我看到一些注释描述了使用GetHashCode()的缺点有很多原因。

在某些情况下,(int)INFLOW_SEARCH_ON.ON_LABEL无法正常工作。

从Enum获取int值的好方法是使用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);

在这种情况下的输出是&#39; 1&#39;。

参考:Get int value from enum