.net 重写ID为的对象的等于

.net 重写ID为的对象的等于,.net,vb.net,equals,.net,Vb.net,Equals,对于具有唯一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 = DirectC

对于具有唯一
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
我从中选取了这个例子,但不完全确定从所有角度(包括性能)是否是更好的解决方案

编辑:

与此版本相比如何:

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)
,可能更有意义。这是表示平等关系有用但不一定是“自然的、全面的”平等关系的好方法。

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

是的,ID_1=ID_2=>\u 1===u 2,其他属性并不重要。@serhio:确实,根据您的代码。继承和平等是痛苦的。我通常不希望覆盖非密封类型的Equals。第二个变量(在编辑中)如何?它的性能会降低吗?@serhio:这可不是一回事。这将使ID=1的香蕉等于ID=1的苹果,假设这是在水果中声明的。但是从表演的角度来看,你认为第一轮瓦兰特更好吗?@serhio:我怀疑从表演的角度来看,它会有什么显著的不同。然而,正确性方面非常重要——让它来指导你。