簡體   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