我有一个枚举
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()感到困惑。使用它是否有任何问题。
答案 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;。