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

标签 .net hashcode

如果我理解正确,在 .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/

相关文章:

c# - Visual Studio 2015 上缺少引用错误

.net - 在哪里可以找到 Visual Studio 2015 的 wsdl.exe?

java - hashcode的Object类默认实现是否使用identityhashcode

Java HashSet 使用自定义类作为键 : "contains()" function always return false

java - .NET 相当于内部类型数组的 java.util.Arrays.hashCode() 函数?

c# - Windows Phone 字符串颜色

.net - VB.NET 中的阴影与重载

c# - 对 WCF 服务的身份验证未使用 SetAuthCookie 和完整的 .net 客户端维护,但可与 silverlight 一起使用

java - 如何实现 hashCode 和 equals 方法

javascript - location.hash 和回溯历史