使用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()感到有点困惑。 使用它有什么问题吗?

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

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

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

我的经验法则是,如果GetHashCode返回一个常量值,你的程序应该仍能正常工作(但可能会慢得多),因为常量GetHashCode通常会履行合同,但具有错误的分布属性。

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

你应该使用(int) MyEnumVariable 。 默认情况下,所有枚举都从intinheritance。

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

其他人说过为什么铸造到int更好。

不使用GetHashCode另一个原因是性能。 它导致拳击。 在我的快速测试中, GetHashCode慢了约50倍(如果重要的话)。

我看到一些注释描述了使用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); 

这种情况下的输出为“1”。

参考: 从枚举中获取int值

您还可以使用Enum静态类提供的选项方法。 例如:

 Enum.TryParse(string ValueType, out TEnum Result) 

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

否则,转换为(int)肯定比GetHashCode()GetHashCode()