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

.net GC移动对象时Object.GetHashCode如何工作?,.net,hashcode,.net,Hashcode,如果我理解正确,在.NET中,Object.GetHashCode()的默认实现返回一个基于对象内存地址的值(至少对于引用类型)。但是,垃圾收集器可以在内存中自由移动对象。大概哈希代码不会仅仅因为GC移动了一个对象而改变,所以这个交互是否有特殊处理,或者我的假设是否错误?它不会返回基于地址的值。它基于对象的同步块返回一个值 同步块在第一次调用对象时分配。GetHashCode被调用(未被重写时)或对象的锁上存在争用。(如果您也调用Wait/Pulse/pulsell,可能会被分配,我还没有看过。

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

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

同步块在第一次调用
对象时分配。GetHashCode
被调用(未被重写时)或对象的锁上存在争用。(如果您也调用Wait/Pulse/pulsell,可能会被分配,我还没有看过。)

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