如果我理解正确,在.NET中,Object.GetHashCode()
的默认实现会根据对象的内存地址返回一个值(至少对于引用类型)。但是,垃圾收集器可以在内存中自由移动对象。大概哈希代码不会因为GC移动一个对象而改变,所以这种交互是否有特殊处理,或者我的假设是错误的?
答案 0 :(得分:21)
它不会根据地址返回值。它根据对象的同步块返回一个值。
第一次调用同步块时object.GetHashCode
被调用(未被覆盖时)或对该对象的锁进行争用。 (如果你调用Wait / Pulse / PulseAll也可以分配它,我还没看过。)
同步块独立于对象主数据在内存中的位置。基本上(据我所知),有一个用于同步块的大表 - 它以某种方式保持高效,部分原因是并非每个对象都需要一个(只有需要系统哈希码或锁定的对象)。