example .net hashcode

.net - example - ¿Cómo funciona Object.GetHashCode cuando el GC mueve un objeto?



override int gethashcode c# (1)

Si entiendo correctamente, en .NET, la implementación predeterminada de Object.GetHashCode() devuelve un valor basado en la dirección de memoria de un objeto (al menos para los tipos de referencia). Sin embargo, el recolector de basura es libre de mover objetos en la memoria. Presumiblemente, el código hash no cambia solo porque el GC mueve un objeto, ¿existe un manejo especial para esta interacción o mis suposiciones están equivocadas?


No devuelve un valor basado en la dirección. Devuelve un valor basado en el bloque de sincronización para el objeto.

Al bloque de sincronización se le asigna la primera vez que se llama object.GetHashCode (cuando no se reemplaza) o hay una contención en el bloqueo del objeto. (Puede asignarse si también llama Esperar / Pulso / Pulso, no he mirado).

El bloque de sincronización es independiente de la ubicación de los datos principales del objeto en la memoria. Básicamente (como lo entiendo) hay una tabla grande para bloques de sincronización, que se mantiene eficiente de alguna manera, en parte debido a que no todos los objetos requieren uno (solo aquellos donde se requiere el código de hash del sistema, o bloqueo).