31

我有一个枚举

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(). 使用它有什么问题吗?

4

7 回答 7

57

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

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

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

我的经验法则是,如果GetHashCode要返回一个常数值,您的程序应该仍然可以正常工作(但可能会慢得多),因为常数很容易GetHashCode履行合同,但分布属性很差。

于 2011-01-03T13:10:07.357 回答
6

当我进行分析时,Enum.GetHashCode 花费了很多周期。我能够通过尽可能使用 (int)Enum 来改进它。

于 2013-02-05T18:11:52.380 回答
5

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

于 2011-01-03T13:04:52.647 回答
4

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

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

于 2013-06-10T20:14:53.557 回答
1

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

于 2011-01-03T13:04:01.803 回答
1

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

在某些情况下 (int)INFLOW_SEARCH_ON.ON_LABEL 不起作用。

从 Enum 获取 int 值的一个好方法是使用 GetTTypeCode() 方法。无论底层类型如何,此方法都有效。在这种情况下,它是 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值

于 2014-08-26T17:16:54.570 回答
0

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

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

如果您要做的只是获取枚举的值。你可以得到字符串 ValueType,例如 "ON_ENTITY_HANDLE" with Enum.GetName(...)

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

于 2011-01-03T13:13:12.767 回答