对于具有唯一Equals
的对象,它是ID
(在VB.NET中)的最佳覆盖吗?
Public Overrides Function Equals(ByVal obj As Object) As Boolean
If obj Is Nothing OrElse Not [GetType]().Equals(obj.GetType()) Then
Return False
End If
Dim otherMyObject As MyObject = DirectCast(obj, MyObject)
Return Me.Id = otherMyObject.Id
End Function
我从MSDN中提取了这个例子,但并不完全确定从各个角度(包括性能)是否是更好的解决方案。
编辑:
与此版本比较如何:
Public Overrides Function Equals(ByVal obj As Object) As Boolean
Dim otherMyObject As MyObject = TryCast(obj, MyObject)
If otherMyObject Is Nothing Then
Return False
Else
Return Me.Id = otherMyObject.Id
End If
End Function
答案 0 :(得分:3)
这取决于你所说的“唯一ID”。如果您可以保证内存中没有任何其他具有相同ID的对象,您可以继承Object
中的功能。但是,如果要将两个相同类型和ID的对象视为相等,那么这看起来很好。您也想要覆盖GetHashCode
。
你真的需要考虑使用平等实现的内容以及他们期望的内容。如果可以有两个具有相同ID但具有不同其他属性的不同对象,那么它们对于“相等”意味着什么?这是否合适?
可能更有意义,例如,在“IEqualityComparer(Of T)
”类型中实现IdEqualityComparer
。这是一种表达平等关系有用的好方法,但不一定是“自然,全面”的平等关系。
答案 1 :(得分:0)
这取决于您在申请中对“等于”的要求。具有相同ClassA
属性的实例Id
始终“等于”另一个具有相同Id
的实例吗?如果实例#1已更改,并且某些属性与实例#2不同,但仍具有相同的Id
,该怎么办?他们还是平等吗?在大多数定义中,这并不相同,但这完全取决于您自己的要求。