皆さん、ここにあなたにとって厄介な問題があります!
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()を計算するにはどうすればよいでしょうか。
ああ、これがあなたに面白いパズルを与えることを願っています。私たちはここで立ち往生しています。
よろしくお願いいたします。ウェイン