覆盖具有ID的对象的等于

时间:2011-10-11 16:56:20

标签: .net vb.net equals

对于具有唯一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

2 个答案:

答案 0 :(得分:3)

这取决于你所说的“唯一ID”。如果您可以保证内存中没有任何其他具有相同ID的对象,您可以继承Object中的功能。但是,如果要将两个相同类型和ID的对象视为相等,那么这看起来很好。您也想要覆盖GetHashCode

你真的需要考虑使用平等实现的内容以及他们期望的内容。如果可以有两个具有相同ID但具有不同其他属性的不同对象,那么它们对于“相等”意味着什么?这是否合适?

可能更有意义,例如,在“IEqualityComparer(Of T)”类型中实现IdEqualityComparer。这是一种表达平等关系有用的好方法,但不一定是“自然,全面”的平等关系。

答案 1 :(得分:0)

这取决于您在申请中对“等于”的要求。具有相同ClassA属性的实例Id始终“等于”另一个具有相同Id的实例吗?如果实例#1已更改,并且某些属性与实例#2不同,但仍具有相同的Id,该怎么办?他们还是平等吗?在大多数定义中,这并不相同,但这完全取决于您自己的要求。