1

2 つのインスタンスが同じsを持つ場合に等しいと見なされる不変Pointクラスを実装しようとしています。Jon Skeet の値型の実装を使用しています。PointCoordinateCoordinate

s の等価性を比較するために、私Pointも継承しEqualityComparer<Point>IEquatable<Point>おり、以下のような単体テストがあります。

Point.cs:

public class Point : EqualityCompararer<Point>, IEquatable<Point>
{
    public Coordinate Coordinate { get; private set; }

    // EqualityCompararer<Point>, IEquatable<Point> methods and other methods
}

PointTests.cs:

[Fact]
public void PointReferencesToSamePortalAreNotEqual()
{
    var point1 = new Point(22.0, 24.0);
    var point2 = new Point(22.0, 24.0);

    // Value equality should return true
    Assert.Equal(point1, point2);

    // Reference equality should return false
    Assert.False(point1 == point2);
}

今、実装しなければならない 3 つのインターフェイス/抽象メソッドに本当に混乱しています。これらは:

  • IEquatable<Point>.Equals(Point other)
  • EqualityComparer<Point>.Equals(Point x, Point y)
  • EqualityComparer<Point>.GetHashCode(Point obj)

MSDNIEquatable<Point>.Equalsによると、私は をオーバーライドしたので、以下も実装する必要があります。

  • Object.Equals(object obj)
  • Object.GetHashCode(object obj)

今、私は単体テストを満たすために必要なすべてのEqualsandメソッドについて本当に混乱しています (参照の等価性は false を返し、値の等価性は and に対して true を返す必要があります)。GetHashCodepoint1point2

Equalsとについてもう少し詳しく説明できる人はいますGetHashCodeか?

4

2 に答える 2

0

Equals : 2 つのオブジェクトが等しいかどうかを確認するために使用されます。(値による、参照による) 等価性のチェックがいくつかあります。リンクを見て、それらがどのように機能するか、誰がどのようにオーバーライドしているかがわからない場合の落とし穴を実際に確認してください。

GetHashCode :
ハッシュ コードは、Dictionary クラス、Hashtable クラス、または DictionaryBase クラスから派生した型などのハッシュ ベースのコレクションにオブジェクトを挿入して識別するために使用される数値です。GetHashCode メソッドは、オブジェクトの等価性を迅速にチェックする必要があるアルゴリズムにこのハッシュ コードを提供します。

内部に大量のオブジェクトを含む 2 つの巨大なオブジェクトがあり、それらの比較に非常に長い時間がかかるとします。そして、それらのオブジェクトのコレクションがあり、それらすべてを比較する必要があります。定義が示すように、GetHashCode は、2 つのオブジェクトを比較したくない場合に比較できる単純な数値を返します。(そして、それらを正しく実装したと仮定すると、2つの異なるオブジェクトは同じハッシュコードを持ちませんが、「等しい」はずのオブジェクトはそうします)。

また、同様のことに関する Jon Skeet の意見が必要な場合は、こちらをご覧ください。

于 2013-11-07T06:54:10.157 に答える