gpt4 book ai didi

c# - 如何在不装箱的情况下检索枚举的哈希码?

转载 作者:太空狗 更新时间:2023-10-29 17:55:08 24 4
gpt4 key购买 nike

如果将枚举存储在聚合类型中,则可能希望将其包含在类型的散列代码中(假设是典型的“multiply by primes”散列函数)。如果只是调用 SomeEnum.GetHashCode(),那么 JIT 似乎会将实例装箱,即使在发布版本中也是如此。

对此进行分析显示,我的应用程序大约有 10% 的时间花在了各种 GetHashCode 函数中的装箱枚举上。

一些值类型实现了IEquatable或类似的接口(interface),这允许调用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;,因此Raymond Chen 在上面的评论中指出,只需将枚举转换为 int 就足以获得哈希码。

关于c# - 如何在不装箱的情况下检索枚举的哈希码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14063313/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com