我正在尝试实现一个不可变Point
类,如果两个Point
实例具有相同的 s,则它们被认为是相等Coordinate
的。我正在使用 Jon Skeet 的值类型实现。Coordinate
为了比较 s 的相等性,Point
我也继承了EqualityComparer<Point>
并且IEquatable<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)
而且由于我已经覆盖IEquatable<Point>.Equals
,根据MSDN ,我还必须实现:
Object.Equals(object obj)
Object.GetHashCode(object obj)
现在我对满足我的单元测试所需的所有Equals
and方法感到非常困惑(对于and ,引用相等应该返回 false 并且值相等应该返回 true )。GetHashCode
point1
point2
谁能进一步解释一下Equals
and GetHashCode
?