繁体   English   中英

等于和GetHashCode混淆

[英]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)

现在,我对满足我的单元测试所需的所有EqualsGetHashCode方法确实感到困惑(对于point1point2引用相等应返回false,值相等应返回true)。

任何人都可以进一步解释EqualsGetHashCode吗?

由于协调中心已经为您实现了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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM