是否正确实施了 IEquatable?我应该总是重写 GetHashCode 吗?

Oma*_*Mir 3 vb.net iequatable

我看到这里提出的问题:我是否正确实现了 Equals()/GetHashCode()?但我的 C# 不是那么强大,而且我对 IEquatable 不太熟悉,如果可能的话,我希望在 VB.NET 中看到它。

我的示例代码(当我到达那里时,该类最终将使用 INotifyPropertyChanged):

Public Class Car
Implements ICloneable
Implements IEquatable(Of Car)

Public Property Make() As String
    Get
        Return m_Make
    End Get
    Set(ByVal value As String)
        m_Make = value
    End Set
End Property
Private m_Make As String

Public Property Model() As String
    Get
        Return m_Model
    End Get
    Set(ByVal value As String)
        m_Model = value
    End Set
End Property
Private m_Model As String

Public Function Clone() As Object Implements System.ICloneable.Clone
    Return New Car() With { _
     .Make = Me.Make, _
     .Model = Me.Model _
    }
End Function

Public Overloads Function Equals(ByVal other As Car) As Boolean Implements System.IEquatable(Of Car).Equals
    Return other.Make = Me.Make AndAlso other.Model = Me.Model
End Function 
End Class
Run Code Online (Sandbox Code Playgroud)

谢谢,

Jef*_*eff 6

您确实需要为 object.Equals 和 object.GetHashCode 实现实现 Overrides。

基本上,只有调用者知道调用 IEquatable(of T).Equals 而不是常规 object.Equals 时,单独实现 IEquatable(of T).Equals 才会起作用。

考虑一下您是否有一个汽车 ArrayList,并检查该列表是否包含(myCar),其中 myCar 的品牌和型号与 ArrayList 中的一辆汽车相同……但 ArrayList 中的汽车实际上并不是完全相同的实例。包含将返回 false。

更糟糕的是,如果您有一个哈希表或字典,它使用 GetHashCode 来确定存储条目的位置,则相等性永远不会起作用,因为具有相同品牌和型号的两辆汽车将为 GetHashCode() 返回不同的值

基本上,这取决于您向 car 添加以下实现:

Public Overrides Overloads Function Equals(obj As Object) As Boolean
    Return TypeOf obj Is Car AndAlso Equals(DirectCast(obj, Car)) 
End Function 

Public Overrides Function GetHashCode() As Int32
    Dim hash As Int32 = 179 ' or something intelligent

    hash = hash * 27 + Make.GetHashCode()
    hash = hash * 27 + Model.GetHashCode()

    Return hash
End Function
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:为什么要实施 IEquatable?为什么不直接重写 Equals 和 GetHashCode 呢?