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か?