首页 新闻 会员 周边 捐助

值类型 GetHashCode

0
悬赏园豆:5 [已解决问题] 解决于 2014-08-25 18:34

      如果一个值类型没有重写GetHashCode方法,那么在这个值类型调用GetHashCode方法时,会产生装箱操作么?为什么会或者不会?如何证明。

p.yl的主页 p.yl | 初学一级 | 园豆:199
提问于:2014-08-25 15:56
< >
分享
最佳答案
0

会,因为没有重写的话,会调用object的GetHashCode方法。

收获园豆:5
龙卷风摧毁停车场! | 菜鸟二级 |园豆:210 | 2014-08-25 16:34

为什么不是ValueType类中的GetHashCode方法,

public extern override int GetHashCode();

p.yl | 园豆:199 (初学一级) | 2014-08-25 16:37

@p.yl: 我错了,会调用ValueType的GethashCode 方法,

 

GetHashCode 方法适用于从 ValueType 派生的类型。 派生类型的一个或多个字段用于计算返回值。 如果您调用派生类型的 GetHashCode 方法,则返回值不大可能适合用作哈希表中的键。 此外,如果其中的一个或多个字段的值发生更改,则返回值也可能不适合用作哈希表中的键。 这两种情况下,请考虑编写自己的 GetHashCode 方法实现,使其更适于表示类型的哈希代码概念。

龙卷风摧毁停车场! | 园豆:210 (菜鸟二级) | 2014-08-25 16:42

@咦?: 在ValueType类中override了外部方法GetHashCode,返回了int类型的值,就是这里是否会产生装箱操作,实在是搞不懂。

p.yl | 园豆:199 (初学一级) | 2014-08-25 17:03

@p.yl: 我刚看了一下,不会进行装箱操作

龙卷风摧毁停车场! | 园豆:210 (菜鸟二级) | 2014-08-25 17:28

@p.yl: int 类型重写了GetHashCode. 结构 test 未重写,所以调用的ValueType的GetHashCode

龙卷风摧毁停车场! | 园豆:210 (菜鸟二级) | 2014-08-25 17:30

@咦?: 因为Struct test未重写GetHashCode,所以在

IL_001c: callvirt instance int32 [mscorlib]System.object::GethashCode

这里,是不是可以理解成从值类型调用了Object类的GetHashCode方法,那么值类型分配在

栈上,如果要调用Object类型的GetHashCode,那么是不是需要先进性装箱从而获取指向引用类型

Object的指针,然后才能执行Object的GetHashCode方法呢?

    提出许多质疑,大家不要生气,一起讨论。:)

p.yl | 园豆:199 (初学一级) | 2014-08-25 17:41

@p.yl: ValueType重写了GetHashCode.所以不存在调用Object的GetHashCode

龙卷风摧毁停车场! | 园豆:210 (菜鸟二级) | 2014-08-25 17:46

@咦?: 那怎么解释你的IL中的

IL_001c: callvirt instance int32 [mscorlib]System.object::GethashCode

这句话呢,这句搞不懂是什么意思的。

p.yl | 园豆:199 (初学一级) | 2014-08-25 18:19

@p.yl: 这个我也没弄的很清楚,我只能给你说,ValueType 重写了 object 的 GetHashCode 方法。并且ValueType 这个类型是引用类型。IL中的 callvirt 是调用虚方法/实例方法。

龙卷风摧毁停车场! | 园豆:210 (菜鸟二级) | 2014-08-25 18:29

@咦?: 谢谢!

p.yl | 园豆:199 (初学一级) | 2014-08-25 18:33

@p.yl: 不客气,再补充一下,如果有装箱操作的话 IL 中会有 box 关键字的。上面我贴的没有 box ,所以也说明没有装箱操作

龙卷风摧毁停车场! | 园豆:210 (菜鸟二级) | 2014-08-25 18:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册