我看到这里提出的问题:我是否正确实现了 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)
谢谢,
您确实需要为 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 呢?