当GC移动对象时,Object.GetHashCode如何工作?

时间:2009-11-10 12:03:07

标签: .net hashcode

如果我理解正确,在.NET中,Object.GetHashCode()的默认实现会根据对象的内存地址返回一个值(至少对于引用类型)。但是,垃圾收集器可以在内存中自由移动对象。大概哈希代码不会因为GC移动一个对象而改变,所以这种交互是否有特殊处理,或者我的假设是错误的?

1 个答案:

答案 0 :(得分:21)

它不会根据地址返回值。它根据对象的同步块返回一个值。

第一次调用同步块时object.GetHashCode被调用(未被覆盖时)对该对象的锁进行争用。 (如果你调用Wait / Pulse / PulseAll也可以分配它,我还没看过。)

同步块独立于对象主数据在内存中的位置。基本上(据我所知),有一个用于同步块的大表 - 它以某种方式保持高效,部分原因是并非每个对象都需要一个(只有需要系统哈希码或锁定的对象)。