23

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

4

1 に答える 1

21

アドレスに基づく値は返されません。オブジェクトの同期ブロックに基づいた値を返します。

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

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

于 2009-11-10T12:05:25.133 に答える