Peguei um bugzinho em uma implementação que eu havia feito na implementação de um operador de igualdade, e fui ver se estava com o mesmo erro em outros lugares. Encontrei uma implementação diferente para o mesmo operador. Vejam abaixo as duas.
Primeira, comparando os atributos no operador diretamente. O "<>" e o equals usam o operador "=".
Public Shared Operator =(ByVal siteA As WebSite, ByVal siteB As WebSite) As Boolean
If siteA Is Nothing OrElse siteB Is Nothing Then
Return False
End If
Return siteA.Id = siteB.Id AndAlso siteA.Name = siteB.Name
End Operator
Public Shared Operator <>(ByVal siteA As WebSite, ByVal siteB As WebSite) As Boolean
Return Not siteA = siteB
End Operator
Public Overrides Function Equals(ByVal obj As Object) As Boolean
Dim site = TryCast(obj, WebSite)
If site Is Nothing Then
Return False
End If
Return site = Me
End Function
Segunda, comparando no Equals, e os operadores usam o Equals para resolução.
Public Shared Operator =(ByVal a As ServerEnvironment, ByVal b As ServerEnvironment) As Boolean
If a Is Nothing OrElse b Is Nothing Then
Return False
End If
Return a.Equals(b)
End Operator
Public Shared Operator <>(ByVal a As ServerEnvironment, ByVal b As ServerEnvironment) As Boolean
Return Not a = b
End Operator
Public Overrides Function Equals(ByVal obj As Object) As Boolean
Dim dest = TryCast(obj, ServerEnvironment)
If dest IsNot Nothing AndAlso dest.Name = Me.Name Then
Return True
Else
Return False
End If
End Function
Interessante, não é? Talvez você esteja se perguntando porque eu faria isso. Oras, objetos de valor ("OVs" ou "VOs") devem ser comparados pelos seus atributos, já que não possuem identidade. Nada mais justo do que sobrescrever o método Equals e já criar os operadores de igualdade.
Para quem está curioso, o bug era na linha 2 do primeiro exemplo. Eu não fazia a verificação de existência do objeto, o que resultava em uma exceção na comparação com objetos nulos.
Postado na(s) categoria(s)
.Net
pelo
giovanni bassi em 22 de janeiro de 2009 às 11:19
| Tags:
visual basic
c3108627-1f4c-4765-82a4-374484e23b59|0|.0