.Equals、IComparable、IComparerの違いについて理解できることを例を挙げて説明してもらえますか。
私はインタビューでこれを尋ねられました。
まず、表面上Equals
はメソッド (すべてのオブジェクトに存在) であり、IComparable
とIComparer
はインターフェイスです。
Equals
は任意のクラスに存在し、クラスのコンテキストに応じて等価性テストを提供するためにオーバーライドできます (オーバーライドすることもお勧めしますGetHashCode
)。デフォルトでは、オブジェクトがメモリ内で等しいかどうかをテストするだけで、あまり役に立ちません。Equals
(およびGetHashCode
) は通常、検索またはハッシュのコンテキストで異なる実装が与えられます。
実装は、単純な等しいかどうかの比較ではなく、大なり/小なりの比較であるメソッドをIComparable
提供するため、よりきめ細かい比較方法です。たとえば、二分探索木構造は、この方法の恩恵を受ける可能性があります。CompareTo
Equals
IComparer
は に似てIComparable
いますが、外部から機能する点が異なります。他の 2 つのオブジェクトを直接変更せずに比較するために使用される「ニュートラル」オブジェクトを定義できます。これは で行う必要がありますIComparable
。
Equals
他の 2 つがインターフェイスの場合は、メソッドです。だから、最大の違いのように見えます。
もっと真剣に-@ChrisSinclairがコメントで答えてくれました...
Equals は、2 つのオブジェクトが等しい (または実装によっては同じ参照である) 場合に true/false を返します。
.Equals() は、クラスが他のすべての可能なオブジェクトに対して等しいかどうかをテストする方法を提供します。これは、オブジェクトの等価性のフォールバックと見なすことができます。したがって、これは私がパラメータとして渡されたオブジェクトと同等であるかという質問に答えます。
IComparable は、順序付け可能なオブジェクトを比較する方法を提供します。考えられる用途には、並べ替えが含まれます。このインターフェースを実装すると、順序付けロジックがクラスに組み込まれます。
IComparer は、ロジックが別のクラスに含まれていることを除いて、IComparable とほとんど同じです。