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

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


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

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

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

链接地址: http://www.djcxy.com/p/79093.html

上一篇: How does Object.GetHashCode work when the GC moves an object?

下一篇: .NET Garbage Collector Basics