如果我正确理解,则在.net中 Object.GetHashCode() 根据对象的内存地址(至少用于参考类型)返回值。但是,垃圾收集器可以在内存中自由移动对象。大概是因为GC移动一个对象而不会更改哈希代码,因此是否有特殊的处理,或者我的假设是错误的?

有帮助吗?

解决方案

它不会根据地址返回值。它根据对象的同步块返回值。

同步块首次分配 object.GetHashCode 被称为(未覆盖时) 或者 对象的锁上有争议。 (如果您也致电Wait/Pulse/pulseall,我可能还没有分配它,我没有看。)

同步块独立于对象在内存中的主要数据的位置。基本上(据我了解),有一张用于同步块的大表格 - 以某种方式保持有效,部分原因是不是每个需要一个对象(仅需要一个系统标签或锁定的对象)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top