使用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
。 默认情况下,所有枚举都从int
inheritance。
当我进行分析时,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()
。