对于具有唯一ID
的对象,这是Equals
(在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
这取决于你所说的"唯一ID"是什么意思。如果你能保证内存中没有任何其他具有相同ID的对象,你可以从Object
继承功能。但是,如果您希望将相同类型和ID的两个对象视为相等,那么这看起来很好。您也想要覆盖GetHashCode
。
你真的需要考虑什么将使用相等的实现和他们期望什么。如果可以有两个具有相同ID但其他属性不同的不同对象,那么它们"相等"意味着什么?这样做合适吗?
例如,在"IdEqualityComparer
"类型中实现IEqualityComparer(Of T)
可能会使更有意义。这是表达相等关系有用的好方法但不一定是"自然的,全面的"相等关系
这取决于您在应用程序中对"Equals"的要求。具有相同Id
属性的实例ClassA
总是"等于"具有相同Id
的另一个实例吗?如果实例#1已经改变,并且一些属性与实例#2不同,但仍然具有相同的Id
,该怎么办?它们还相等吗?在大多数定义中,这是不相等的,但这完全取决于您自己的要求。