0

複雑な構造のオブジェクトにはプロパティDictionary<Object, Object> Annotationsがあり、一部の処理フェーズで使用されるメタ データとカスタム データを格納できます。を作成し、static readonly object UniqueName = new object()それを辞書のキーとして使用できるようになりました。static readonly objectそれが一意であることを確実に知っているので、私は a を使用します。他の誰もまったく同じオブジェクト インスタンスを作成することはできません。代わりに文字列をキーとして使用した場合、他の誰かが誤って同じ文字列をキーとして使用する可能性があり、これが問題を引き起こす可能性があります。

ただし、いくつかの情報源 (ここを含む) から、デフォルトのGetHashCode実装はメモリ内のオブジェクトの場所に基づいていることがわかりました。これは、オブジェクトがガベージ コレクターによって移動されると変更される可能性があり、これにより返されるハッシュが変更される可能性があります。その場合、ディクショナリはキー オブジェクトに関連付けられた値を見つけることができません。

フィールドを持たないオブジェクトが存続期間中にハッシュ コードを変更しないようにするにはどうすればよいですか?

単純な解決策は、常に を返すKeyオブジェクトを作成することです。ただし、これはディクショナリのパフォーマンスに深刻な影響を与えるため、解決策ではありません。GetHashCode42

4

2 に答える 2

2

のデフォルトの実装は GetHashCode、メモリ アドレスではなくインデックスを返します。このインデックスはオブジェクトの存続期間中一意であるため、オブジェクトがメモリ内で移動された場合でも、呼び出すと常に同じ値が返されます。GetHashCode

ただし、オブジェクトがガベージ コレクションされると、後で作成する新しいオブジェクトに対して、ガベージ コレクションの前の以前のオブジェクトと同じ値を返すことが有効になります。

あなたの例では、UniqueNameを呼び出すと変数は常に同じ値を返し、作成したGetHashCodeインスタンスはObjectプログラムの存続期間中同じハッシュコードを返すことはありません。

于 2012-10-04T10:44:38.823 に答える
2

実装によって、返されるハッシュが変更される場合があります

デフォルトのハッシュ コードの実装では、単一のオブジェクトの値が変更されることはありません。そのオブジェクトの存続期間中は変更されないため、安全に使用できます。私はあなたが指している答えを(すぐに)読みましたが、単一のオブジェクトの存続期間中に変化するハッシュコードについては話していません。

于 2012-10-04T10:22:40.737 に答える