[英]Equals and GetHashCode confusion
我正在尝试实现一个不变的Point
类,如果两个Point
实例具有相同的Coordinate
则认为它们是相等的。 我正在使用Jon Skeet的Coordinate
值类型的实现 。
为了比较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)
而且由于我已重写IEquatable<Point>.Equals
,因此根据MSDN我还必须实现:
Object.Equals(object obj)
Object.GetHashCode(object obj)
现在,我对满足我的单元测试所需的所有Equals
和GetHashCode
方法确实感到困惑(对于point1
和point2
引用相等应返回false,值相等应返回true)。
任何人都可以进一步解释Equals
和GetHashCode
吗?
由于协调中心已经为您实现了GetHashCode()
和Equals(Coordinate)
,因此实际上非常简单,只需使用基础实现
public class Point : IEquatable<Point>
{
public Coordinate Coordinate { get; private set; }
public override int GetHashCode()
{
return Coordinate.GetHashCode();
}
public override bool Equals(object obj)
{
return this.Equals(obj as Point);
}
public bool Equals(Point point)
{
if(point == null)
return false;
return this.Coordinate.Equals(point.Coordinate);
}
}
IEquatable<Point>
是不必要的,因为它所做的就是为您节省了额外的演员。 它主要用于struct
类型的类,以防止该结构的拳击到object
传递到bool Equals(object)
。
等于 :用于检查两个对象是否相等。 有几种检查是否相等的方法(按值,按引用),您真的想看看链接以了解它们如何工作,以及在不知道谁在压制它们的情况下的陷阱。
GetHashCode :
哈希码是一个数字值,用于在基于哈希的集合中插入和标识对象,例如Dictionary类,Hashtable类或从DictionaryBase类派生的类型。 GetHashCode方法为需要快速检查对象相等性的算法提供此哈希码。
假设您有两个巨大的对象,内部有很多对象,并且比较它们可能需要很长时间。 然后,您具有这些对象的集合,并且需要将它们全部进行比较。 就像定义中所说的,如果不想比较两个对象,GetHashCode将返回一个可以比较的简单数字。 (并假设您正确实现了它们,则两个不同的对象将不会具有相同的哈希码,而假定为“相等”的对象将具有相同的哈希码)。
如果您希望乔恩·斯凯特(Jon Skeet)对类似内容有意见,请看这里 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.