如果我理解正确,在 .NET 中 Object.GetHashCode()
的默认实现根据对象的内存地址返回一个值(至少对于引用类型)。但是,垃圾收集器可以自由地在内存中移动对象。大概哈希码不会仅仅因为 GC 移动一个对象而改变,那么这种交互是否有特殊处理,或者我的假设是错误的?
最佳答案
它不会根据地址返回值。它根据对象的同步块(synchronized block)返回一个值。
第一次分配同步块(synchronized block)object.GetHashCode
被调用(当没有被覆盖时)或者对象的锁存在争用。 (如果你也调用Wait/Pulse/PulseAll可能会分配,我没看过。)
同步块(synchronized block)独立于对象的主要数据在内存中的位置。基本上(据我所知)有一个用于同步块(synchronized block)的大表 - 它以某种方式保持高效,部分原因是并非每个对象都需要一个(仅需要系统哈希码或锁定的对象)。
关于.net - GC 移动对象时 Object.GetHashCode 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1707471/