首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等于与GetHashCode混淆

等于与GetHashCode混淆
EN

Stack Overflow用户
提问于 2013-11-07 06:44:23
回答 2查看 246关注 0票数 1

我试图实现一个不可变的Point类,其中两个Point实例被认为是相等的,如果它们具有相同的Coordinates,则使用Coordinate值类型的Jon的实现

为了比较Point的相等性,我还继承了EqualityComparer<Point>IEquatable<Point>,并且我有一个单元测试如下:

Point.cs:

代码语言:javascript
复制
public class Point : EqualityCompararer<Point>, IEquatable<Point>
{
    public Coordinate Coordinate { get; private set; }

    // EqualityCompararer<Point>, IEquatable<Point> methods and other methods
}

PointTests.cs:

代码语言:javascript
复制
[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方法感到困惑(引用相等应该返回false,值相等对于point1point2应该返回true )。

有人能进一步解释一下EqualsGetHashCode吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-07 07:16:55

因为坐标已经为您实现了GetHashCode()Equals(Coordinate),所以实际上很容易,只需使用底层的嵌入即可。

代码语言:javascript
复制
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中。

票数 1
EN

Stack Overflow用户

发布于 2013-11-07 06:54:10

等于:用于检查两个对象是否相等。有几个等式的检查(通过值,通过引用),并且您真的想查看一下链接,看看它们是如何工作的,以及当您不知道是谁在重写它们时的缺陷。

GetHashCode

哈希代码是一个数值,用于在基于哈希的集合中插入和标识对象,例如Dictionary类、Hashtable类或从DictionaryBase类派生的类型。GetHashCode方法为需要快速检查对象相等性的算法提供了此哈希代码。

假设您有两个巨大的对象,里面有大量的对象,比较它们可能需要很长的时间。然后你有了这些对象的集合,你需要对它们进行比较。正如定义所述,如果不想比较这两个对象,GetHashCode将返回一个可以比较的简单数字。(假设您正确地实现了它们,两个不同的对象将不具有相同的哈希代码,而被认为是“相等”的对象则会有相同的哈希代码。)

如果你想要乔恩·斯基特对类似的观点,请看这里

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19829588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档