2009-11-10 23 views
22

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 son incorrectas?¿Cómo funciona Object.GetHashCode cuando el GC mueve un objeto?

Respuesta

21

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 reemplaza) o hay contención en la cerradura para el objeto. (Puede asignarse si llama también a Wait/Pulse/PulseAll, no he buscado).

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

Cuestiones relacionadas