如果一个值类型没有重写GetHashCode方法,那么在这个值类型调用GetHashCode方法时,会产生装箱操作么?为什么会或者不会?如何证明。
会,因为没有重写的话,会调用object的GetHashCode方法。
为什么不是ValueType类中的GetHashCode方法,
@p.yl: 我错了,会调用ValueType的GethashCode 方法,
GetHashCode 方法适用于从 ValueType 派生的类型。 派生类型的一个或多个字段用于计算返回值。 如果您调用派生类型的 GetHashCode 方法,则返回值不大可能适合用作哈希表中的键。 此外,如果其中的一个或多个字段的值发生更改,则返回值也可能不适合用作哈希表中的键。 这两种情况下,请考虑编写自己的 GetHashCode 方法实现,使其更适于表示类型的哈希代码概念。
@咦?: 在ValueType类中override了外部方法GetHashCode,返回了int类型的值,就是这里是否会产生装箱操作,实在是搞不懂。
@p.yl: 我刚看了一下,不会进行装箱操作
@p.yl: int 类型重写了GetHashCode. 结构 test 未重写,所以调用的ValueType的GetHashCode
@咦?: 因为Struct test未重写GetHashCode,所以在
IL_001c: callvirt instance int32 [mscorlib]System.object::GethashCode
这里,是不是可以理解成从值类型调用了Object类的GetHashCode方法,那么值类型分配在
栈上,如果要调用Object类型的GetHashCode,那么是不是需要先进性装箱从而获取指向引用类型
Object的指针,然后才能执行Object的GetHashCode方法呢?
提出许多质疑,大家不要生气,一起讨论。:)
@p.yl: ValueType重写了GetHashCode.所以不存在调用Object的GetHashCode
@咦?: 那怎么解释你的IL中的
IL_001c: callvirt instance int32 [mscorlib]System.object::GethashCode
这句话呢,这句搞不懂是什么意思的。
@p.yl: 这个我也没弄的很清楚,我只能给你说,ValueType 重写了 object 的 GetHashCode 方法。并且ValueType 这个类型是引用类型。IL中的 callvirt 是调用虚方法/实例方法。
@咦?: 谢谢!
@p.yl: 不客气,再补充一下,如果有装箱操作的话 IL 中会有 box 关键字的。上面我贴的没有 box ,所以也说明没有装箱操作