私が正しく理解していれば、.NET のデフォルトの実装はObject.GetHashCode()
、オブジェクトのメモリ アドレスに基づいて値を返します (少なくとも参照型の場合)。ただし、ガベージ コレクターはメモリ内でオブジェクトを自由に移動できます。おそらく、GC がオブジェクトを移動したからといって、ハッシュ コードは変更されないので、この相互作用に特別な処理があるのでしょうか、それとも私の仮定が間違っているのでしょうか?
1 に答える
21
アドレスに基づく値は返されません。オブジェクトの同期ブロックに基づいた値を返します。
同期ブロックは、最初object.GetHashCode
に呼び出されたとき (オーバーライドされていない場合) に割り当てられるか、オブジェクトのロックに競合があります。(Wait/Pulse/PulseAll も呼ぶと割り当てられるかもしれませんが、見ていません。)
同期ブロックは、メモリ内のオブジェクトのメイン データの場所とは無関係です。基本的に(私が理解しているように)、同期ブロック用の大きなテーブルが1つあります。これは、すべてのオブジェクトがテーブルを必要とするわけではないため(システムハッシュコードが必要な場合、またはロックされている場合のみ)、何らかの方法で効率的に保たれています。
于 2009-11-10T12:05:25.133 に答える