)(GetHashCodeメソッドをオーバーライドするタイプにObject.GetHashCodeを()を使用する方法
-
22-09-2019 - |
質問
私は、クラスAその実装IEquatable <>、そのフィールドを使用して(上書き/対等を実現するために(、A.bとA.cを言う))とGetHashCodeメソッドをオーバーライドする()があり、すべてがうまく、時間の99%に動作します。クラスAは、インタフェースDからのすべての継承する階層(クラスB、C)の一部です。それらはすべて、彼らはすべて自分のデフォルトEqualsを()/ GetHashCodeメソッド()。
を運ぶときので、それは便利ですが、辞書辞書にまとめて保存することができますただし、A私はいつかA.bとA.cの値を取得するためのいくつかの作業を行う必要があります構築中。それが起こっている間、私が構築されていますインスタンスへの参照を格納します。その場合、私はこのようにA.が提供するデフォルトEqualsを()/ GetHashCodeメソッド()のオーバーライドを使用したくない、私は)/ GetHashCodeメソッド()オブジェクトの対等(の使用を強制するためのものだと、ReferenceEqualityComparerを実装することを考えていました。 :
private class ReferenceEqualityComparer<T> : IEqualityComparer<T>
{
#region IEqualityComparer<T> Members
public bool Equals(T x, T y)
{
return System.Object.ReferenceEquals(x, y);
}
public int GetHashCode(T obj)
{
// what goes here? I want to do something like System.Object.GetHashCode(obj);
}
#endregion
}
質問はI(Aの外側)はAのインスタンスのObject.GetHashCodeを()を呼び出すことができますどのように、A Object.GetHashCodeをオーバーライドします()以来、ありますか?
はもちろんの一つの方法は、IEquatableを<実装>といつも私が作成することを任意の辞書にされたIEqualityComparer <>を供給しないためにAのためになるが、私は別の答えを願っています。
おかげ
解決
object.ReferenceEquals
のための自然な一致は RuntimeHelpers.GetHashCode
のである。
完全な詳細については、この質問への答えとObjectReferenceEqualityComparer<T>
の実装を参照してください:作りつけIEqualityComparer<T>
でその用途ReferenceEquals
する
他のヒント
相互運用機能経由でCLRの基本実装を呼び出します>