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?

¿Fue útil?

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).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top