非ジェネリックを実装する必要が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>
ように使用されるべきではありません。別のクラスとして実装し、パラメータとして使用する必要があります。
みなさん、ありがとうございました。