[英]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)
現在,我對滿足我的單元測試所需的所有Equals
和GetHashCode
方法確實感到困惑(對於point1
和point2
引用相等應返回false,值相等應返回true)。
任何人都可以進一步解釋Equals
和GetHashCode
嗎?
由於協調中心已經為您實現了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.