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.
Giovanni Bassi
Arquiteto e desenvolvedor, agilista, escalador, provocador. É fundador e CSA da Lambda3. Programa porque gosta. Acredita que pessoas autogerenciadas funcionam melhor e por acreditar que heterarquia é mais eficiente que hierarquia. Foi reconhecido Microsoft MVP há mais de dez anos, dos mais de vinte que atua no mercado. Já palestrou sobre .NET, Rust, microsserviços, JavaScript, TypeScript, Ruby, Node.js, Frontend e Backend, Agile, etc, no Brasil, e no exterior. Liderou grupos de usuários em assuntos como arquitetura de software, Docker, e .NET.