我试图实现一个不可变的Point类,其中两个Point实例被认为是相等的,如果它们具有相同的Coordinates,则使用Coordinate值类型的Jon的实现。
为了比较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方法感到困惑(引用相等应该返回false,值相等对于point1和point2应该返回true )。
有人能进一步解释一下Equals和GetHashCode吗?
发布于 2013-11-07 07:16:55
因为坐标已经为您实现了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类型类,以防止将结构装箱到传递给bool Equals(object)的object中。
发布于 2013-11-07 06:54:10
等于:用于检查两个对象是否相等。有几个等式的检查(通过值,通过引用),并且您真的想查看一下链接,看看它们是如何工作的,以及当您不知道是谁在重写它们时的缺陷。
GetHashCode
哈希代码是一个数值,用于在基于哈希的集合中插入和标识对象,例如Dictionary类、Hashtable类或从DictionaryBase类派生的类型。GetHashCode方法为需要快速检查对象相等性的算法提供了此哈希代码。
假设您有两个巨大的对象,里面有大量的对象,比较它们可能需要很长的时间。然后你有了这些对象的集合,你需要对它们进行比较。正如定义所述,如果不想比较这两个对象,GetHashCode将返回一个可以比较的简单数字。(假设您正确地实现了它们,两个不同的对象将不具有相同的哈希代码,而被认为是“相等”的对象则会有相同的哈希代码。)
如果你想要乔恩·斯基特对类似的观点,请看这里。
https://stackoverflow.com/questions/19829588
复制相似问题