23

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

4

1 回答 1

21

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

同步块是在第一次object.GetHashCode被调用时分配的(当没有被覆盖时)或者对象的锁存在争用。(如果你也调用Wait/Pulse/PulseAll可能会分配,我没看过。)

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

于 2009-11-10T12:05:25.133 回答