I am trying to implement an immutable Point
class where two Point
instances are considered equal if they have the same Coordinate
s. I am using Jon Skeet's implementation of a Coordinate
value type.
For comparing equality of Point
s I have also inherited EqualityComparer<Point>
and IEquatable<Point>
and I have a unit test as below:
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);
}
Now I am really confused by the 3 interface/abstract methods that I must implement. These are:
IEquatable<Point>.Equals(Point other)
EqualityComparer<Point>.Equals(Point x, Point y)
EqualityComparer<Point>.GetHashCode(Point obj)
And since I have overriden IEquatable<Point>.Equals
, according to MSDN I must also implement:
Object.Equals(object obj)
Object.GetHashCode(object obj)
Now I am really confused about all the Equals
and GetHashCode
methods that are required to satisfy my unit test (Reference equality should return false and value equality should return true for point1
and point2
).
Can anyone explain a bit further about Equals
and GetHashCode
?