2009-11-10 9 views
22

Se ho capito bene, in .NET l'implementazione predefinita di Object.GetHashCode() restituisce un valore basato sull'indirizzo di memoria di un oggetto (almeno per i tipi di riferimento). Tuttavia, il garbage collector è libero di spostare gli oggetti in memoria. Presumibilmente il codice hash non cambia solo perché il GC sposta un oggetto, quindi c'è una gestione speciale per questa interazione, o le mie supposizioni sono errate?Come funziona Object.GetHashCode quando il GC sposta un oggetto?

risposta

21

Non restituisce un valore in base all'indirizzo. Restituisce un valore basato sul blocco di sincronizzazione per l'oggetto.

Il blocco di sincronizzazione è assegnata la prima volta object.GetHashCode viene chiamato (quando non override) o c'è contesa sul blocco per l'oggetto. (Può essere assegnato se si chiama Wait/Pulse/PulseAll anche, non ho guardato.)

Il blocco di sincronizzazione è indipendente dalla posizione dei dati principali dell'oggetto in memoria. Fondamentalmente (a quanto ho capito) c'è una grande tabella per i blocchi di sincronizzazione, che viene mantenuta efficiente in qualche modo, in parte a causa non di tutti gli oggetti che ne richiedono uno (solo quelli in cui è richiesto il codice hash del sistema o blocco).

Problemi correlati