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

Wes*_*ill 23 .net hashcode

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

Jon*_*eet 21

它不会根据地址返回值.它返回基于对象的同步块的值.

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

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