一个人如何检索枚举的哈希码,而不拳呢?(How does one retrieve the hash

2019-08-04 21:08发布

如果一个有存储一个聚合类型内的枚举,一个可能要包括该类型的散列码内(假设一个典型的“ 由素数相乘 ”散列函数)。 如果一个人只是调用SomeEnum.GetHashCode()它看来,JIT盒实例,即使在发布版本。

剖析这说明我的应用程序的时间约10%用于各种内部拳击枚举GetHashCode功能。

几个值类型实现IEquatable或类似的接口,它允许呼叫GetHashCode作为一个静态方法; 这就避免了拳击。 但System.Enum不提供的静态超载GetHashCode 。 有没有计算应使用,但避免拳击的代码的一些方法?

Answer 1:

你可以强制转换为基本类型的枚举(通常int除非枚举定义另有规定的除外),并使用该类型的重写GetHashCode()方法。

enum TestEnum
{
    Test1,
    Test2
}

TestEnum t = TestEnum.Test1;
((int)t).GetHashCode(); // no boxing
t.GetHashCode(); // boxing

下面是该代码的IL:

IL_0000:  nop
IL_0001:  ldc.i4.0
IL_0002:  stloc.0
IL_0003:  ldloc.0
IL_0004:  stloc.1
IL_0005:  ldloca.s   V_1
IL_0007:  call       instance int32 [mscorlib]System.Int32::GetHashCode()
IL_000c:  pop
IL_000d:  ldloc.0
IL_000e:  box        ConsoleApplication1.Program/TestEnum
IL_0013:  callvirt   instance int32 [mscorlib]System.Object::GetHashCode()
IL_0018:  pop
IL_0019:  ret

编辑:为了完整起见,我要指出的是身体int.GetHashCode()仅仅是return this; ,从而雷蒙德陈在上面的评论中指出,简单地铸造枚举一个int是不够好,以获得散列码。



文章来源: How does one retrieve the hash code of an enumeration without boxing it?