Переопределение Equals для объекта с идентификатором - PullRequest
2 голосов
/ 11 октября 2011

Это лучшее переопределение для Equals (в VB.NET) для объекта, имеющего уникальный ID?

  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 ]

3 голосов
/ 11 октября 2011

Это зависит от того, что вы подразумеваете под «уникальным идентификатором». Если вы можете гарантировать, что в памяти не будет никаких других объектов с таким же идентификатором, вы можете просто наследовать функциональность от Object. Однако, если вы хотите рассматривать два объекта одинакового типа и идентификатора как равные, то это выглядит хорошо. Вы также хотите переопределить GetHashCode.

Вы действительно должны рассмотреть, что собирается использовать реализацию равенства и что они ожидают. Если могут быть два разных объекта с одинаковым идентификатором, но с разными другими свойствами, что означает, что они равны? Это уместно или нет?

Это может имеет больше смысла для реализации IEqualityComparer(Of T) в чем-то вроде, например, типа "IdEqualityComparer". Это хороший способ выразить, что отношение равенства полезно , но не обязательно является «естественным, всеобъемлющим» отношением равенства.

0 голосов
/ 11 октября 2011

Это зависит от ваших требований к «Равным» в вашей заявке. Экземпляр ClassA с тем же Id свойством всегда"равно" другому экземпляру с таким же Id? Что, если экземпляр № 1 был изменен, а некоторые свойства отличаются от экземпляра № 2, но все еще имеют тот же Id. Они все еще равны? В большинстве определений это не будет равно, но это полностью соответствует вашим собственным требованиям.

...