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:

Comentar


(Vai mostrar seu Gravatar)

  Country flag

biuquote
  • Comentário
  • Pré-visualização
Loading



Quem é Giovanni Bassi

Giovanni Bassi Sou uma pessoa apaixonada por tecnologia e especificamente por .Net. Sou consultor independente especialista em .Net, focado em arquitetura e melhores práticas. Tenho dezenas de artigos publicados na .Net Magazine, revista da qual sou editor técnico. Ministro palestras e cursos de vez em quando, e quando dá tempo eu respiro um pouco. Mais detalhes nesta página.

Busca

Selos

Eu vou ao TechEd Brasil 2010, e você?

MVP

MCPD

MCSD

.Net Magazine

Abaixo ao if!

Calendário

«  julho 2010  »
seteququsedo
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678
Ver detalhamento de posts no calendário

Blogs interessantes

    OPMLDownload OPML file

    Postagens recentes

    Comentários recentes

    Disclaimer / Aviso
    As opiniões colocadas neste blog são minhas e pessoais e não expressam necessariamente as opiniões de meus empregadores, pareceiros e amigos. Da mesma forma, os comentários feitos por leitores do blog não expressam a minha opinião.

    © Copyright 2010 .Net Unplugged
    Log in