非ジェネリックを実装する必要がGetHashCodeありEquals、クラスが実装する場合はどうなりIEqualityComparer<T>ますか?
更新:
私の希望は、MSがを導入したときにコレクションの実装を更新することでしたIEqualityComparer<T>。そのDictionaryため、他のコレクションクラスは、クラスがIEqualityComparer<T>ジェネリックメソッドGetHashCodeを実装および使用していないかどうか、およびEqualsそのインターフェイスが実装されていない場合にのみ内部的にチェックすると思いました。コレクションのサポートがなければ、そのインターフェースにはほとんど価値がありません。
Update2:ILSpyを使用して
チェックDictionary.FindEntry(TKey key)しました。使用しますIEqualityComparer<TKey>(comparer以下の変数)。GetHashCode実際、私は一般的ではない関数や関数の使用をまったく見つけませんでしEqualsた。
int num = this.comparer.GetHashCode(key) & 2147483647;
for (int i = this.buckets[num % this.buckets.Length]; i >= 0; i = this.entries[i].next)
{
if (this.entries[i].hashCode == num
&& this.comparer.Equals(this.entries[i].key, key))
{
return i;
}
}
したがって、私のクラスは、IEqualityComparer<T>で適切に使用するために実装する必要があるだけのようDictionaryです。
万が一の場合に備えて、ジェネリックではない関数を実装しても害はないことを理解しています。
しかし、それが価値をもたらさないのであれば、私たちは時間を費やすべきでしょうか?
私の質問をより具体的にします:
非ジェネリックを実装する必要がGetHashCodeありEquals、クラスが実装する場合IEqualityComparer<T>:
- コードでジェネリックではないコレクションを使用していません
GetHashCodeサードパーティのコードは、私のコードのEqualsメソッドを呼び出しません。
Microsoftコードが正しく機能するには、非汎用バージョンが必要ですか?
Update3:わかったと思います。IEqualityComparer<T>それは私のクラス内で実装されると思いました。その場合、メソッドの汎用バージョンと非汎用バージョンが1か所にあります。それはどのIEqualityComparer<T>ように使用されるべきではありません。別のクラスとして実装し、パラメータとして使用する必要があります。
みなさん、ありがとうございました。