2009-11-10 5 views
22

Wenn ich richtig verstehe, gibt in .NET die Standardimplementierung von Object.GetHashCode() einen Wert basierend auf der Speicheradresse eines Objekts zurück (zumindest für Referenztypen). Der Garbage Collector kann jedoch Objekte im Speicher frei verschieben. Vermutlich ändert sich der Hash-Code nicht, nur weil der GC ein Objekt bewegt, gibt es also eine spezielle Handhabung für diese Interaktion, oder sind meine Annahmen falsch?Wie funktioniert Object.GetHashCode, wenn der GC ein Objekt verschiebt?

Antwort

21

Es wird kein Wert basierend auf der Adresse zurückgegeben. Es gibt einen Wert zurück, der auf dem Synchronisierungsblock für das Objekt basiert.

Der Sync-Block wird beim ersten Aufruf von object.GetHashCode zugewiesen (wenn nicht überschrieben) oder gibt es Streit auf die Sperre für das Objekt. (Es kann zugewiesen werden, wenn Sie Wait/Pulse/PulseAll auch aufrufen, habe ich nicht gesucht.)

Der Sync-Block ist unabhängig von der Position der Hauptdaten des Objekts im Speicher. Grundsätzlich gibt es (wie ich es verstehe) eine große Tabelle für Sync-Blöcke - die auf gewisse Weise effizient gehalten wird, teilweise aufgrund der Tatsache, dass nicht jedes Objekt eines benötigt (nur solche, bei denen der System-Hashcode erforderlich ist oder Sperren).

Verwandte Themen