1

我正在尝试实现一个不可变Point类,如果两个Point实例具有相同的 s,则它们被认为是相等Coordinate的。我正在使用 Jon Skeet 的值类型实现。Coordinate

为了比较 s 的相等性,Point我也继承了EqualityComparer<Point>并且IEquatable<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)

现在我对满足我的单元测试所需的所有Equalsand方法感到非常困惑(对于and ,引用相等应该返回 false 并且值相等应该返回 true )。GetHashCodepoint1point2

谁能进一步解释一下Equalsand GetHashCode

4

2 回答 2

1

因为 Coordinate 已经实现了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类型类来防止将struct in 装箱到object传入的to 中bool Equals(object)

于 2013-11-07T07:16:55.200 回答
0

Equals:用于检查两个对象是否相等。有几个相等性检查(按值,按引用),您真的想查看链接以了解它们是如何工作的,以及当您不知道谁在如何覆盖它们时的陷阱。

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

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

如果你想要 Jon Skeet 对类似事情的看法,请看这里

于 2013-11-07T06:54:10.157 回答