¿Cómo funciona Object.GethashCode cuando el GC mueve un objeto?
Pregunta
Si lo 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 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, entonces, ¿hay un manejo especial para esta interacción o mis suposiciones están equivocadas?
Solución
No devuelve un valor basado en la dirección. Devuelve un valor basado en el bloque de sincronización para el objeto.
El bloque de sincronización se asigna la primera vez object.GetHashCode
se llama (cuando no se anula) o Hay contienda en la cerradura del objeto. (Se puede asignar si también llamas a Wait/Pulse/Pulseally, 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 (según tengo entendido) 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 que requieren uno (solo los que se requiere el sistema del sistema o el bloqueo).