为带有ID的对象重写等号



对于具有唯一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,该怎么办?它们还相等吗?在大多数定义中,这是不相等的,但这完全取决于您自己的要求。

最新更新