21

皆さん、ここにあなたにとって厄介な問題があります!

TickZoomシステムの一部は、すべてのタイプのオブジェクトのインスタンスをDictionary<>タイプに収集する必要があります。

それらの同等性とハッシュコードは、値の同等性ではなく参照の同等性を意味するオブジェクトのインスタンスに基づいていることが不可欠です。課題は、システム内の一部のオブジェクトが値の同等性として使用するためにEquals()とGetHashCode()をオーバーライドし、それらの内部値が時間の経過とともに変化することです。つまり、EqualsとGetHashCodeは役に立たないということです。これを煩わしくではなく一般的に解決するにはどうすればよいですか?

これまで、ハッシュ用にObjectHandleという各オブジェクトを辞書にラップする構造体を作成しました。以下に示すように、Equals()を実装しましたが、ハッシュコードの計算方法の問題が残っています。

public struct ObjectHandle : IEquatable<ObjectHandle>{
    public object Object;
    public bool Equals(ObjectHandle other) {
        return object.ReferenceEquals(this.Object,other.Object);
    }
}

見る?オブジェクト内のオーバーライドされたEquals()実装に関係なく、参照の同等性を比較するメソッドobject.ReferenceEquals()があります。

では、オーバーライドされたGetHashCode()メソッドを気にせずに、参照のみを考慮して、一致するGetHashCode()を計算するにはどうすればよいでしょうか。

ああ、これがあなたに面白いパズルを与えることを願っています。私たちはここで立ち往生しています。

よろしくお願いいたします。ウェイン

4

3 に答える 3

25

RuntimeHelpers.GetHashCode() does exactly what is needed here.

于 2010-05-31T17:44:34.603 に答える
2

あなたはパターンを破っています、これは解決できない質問につながります。メソッドEqualsは、参照を比較するのではなく、オブジェクトの内容を比較する必要があります。それは何をするのですかobject.Equals、なぜ同じ動作でオーバーライドするのですか?

今についてGetHashCode。繰り返しますが、ハッシュコードはオブジェクトのコンテンツに適用されるハッシュ関数です。参照のみで計算することはできません。オブジェクトへのポインタを使用してハッシュとして使用することもできますが、.netではオブジェクトのアドレスをGCで変更できます。

于 2010-05-31T16:37:26.390 に答える
0

ハッシュコードは一意である必要はありません。(ただし、一意性によりパフォーマンスが向上します)。
つまり、できることの1つは、タイプ名でハッシュコードを設定することです。同じタイプのすべてのオブジェクトは同じハッシュコードを持ちます。

于 2010-05-31T16:33:30.317 に答える