2009-11-10 3 views
22

私が正しく理解していれば、.NETではObject.GetHashCode()のデフォルトの実装はオブジェクトのメモリアドレスに基づいて値を返します(少なくとも参照型の場合)。しかし、ガベージコレクタは自由にオブジェクトをメモリ内で動かすことができます。おそらく、GCがオブジェクトを動かすだけで、ハッシュコードが変わるわけではないので、この相互作用のための特別な処理がありますか、または私の仮定が間違っていますか?GCがオブジェクトを移動するときにObject.GetHashCodeはどのように機能しますか?

答えて

21

アドレスに基づいて値を返しません。オブジェクトのシンクブロックに基づいて値を返します。

同期ブロックは、object.GetHashCodeが呼び出されたとき(オーバーライドされていない場合)に割り当てられます。またはオブジェクトのロックに競合があります。 (Wait/Pulse/PulseAllを呼び出しても割り当てられますが、私は見ていません)

シンクブロックは、メモリ内のオブジェクトのメインデータの場所に依存しません。基本的に(私が理解しているように)シンクブロックのための1つの大きなテーブルがあります。これは、何らかの方法で効率的に保たれています(システムのハッシュコードが必要な場所またはロックされているオブジェクトのみ)。

関連する問題