如果一个有存储一个聚合类型内的枚举,一个可能要包括该类型的散列码内(假设一个典型的“ 由素数相乘 ”散列函数)。 如果一个人只是调用SomeEnum.GetHashCode()
它看来,JIT盒实例,即使在发布版本。
剖析这说明我的应用程序的时间约10%用于各种内部拳击枚举GetHashCode
功能。
几个值类型实现IEquatable
或类似的接口,它允许呼叫GetHashCode
作为一个静态方法; 这就避免了拳击。 但System.Enum
不提供的静态超载GetHashCode
。 有没有计算应使用,但避免拳击的代码的一些方法?
你可以强制转换为基本类型的枚举(通常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
是不够好,以获得散列码。