CA2218: Substituir GetHashCode ao substituir Equals

Property Valor
ID da regra CA2218
Título Substituir GetHashCode ao substituir Equals
Categoria Usage
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 8 Como sugestão

Causa

Um tipo público substitui System.Object.Equals, mas não substitui System.Object.GetHashCode.

Descrição da regra

GetHashCode retorna um valor, com base na instância atual, adequado para algoritmos de hash e estruturas de dados, como tabelas de hash. Dois objetos do mesmo tipo e iguais devem retornar o mesmo código hash para garantir que as instâncias dos seguintes tipos funcionem corretamente:

Observação

Essa regra é aplicável comente ao código do Visual Basic. O compilador C# gera um aviso separado, CS0659.

Como corrigir violações

Para corrigir uma violação dessa regra, forneça uma implementação de GetHashCode. Para um par de objetos do mesmo tipo, certifique-se de que a implementação retorne o mesmo valor se sua implementação de Equals retornar true para o par.

Quando suprimir avisos

Não suprima um aviso nessa regra.

Exemplo de classe

O exemplo a seguir mostra uma classe (tipo de referência) que viola essa regra.

' This class violates the rule.
Public Class Point

    Public Property X As Integer
    Public Property Y As Integer

    Public Sub New(x As Integer, y As Integer)
        Me.X = x
        Me.Y = y
    End Sub

    Public Overrides Function Equals(obj As Object) As Boolean

        If obj = Nothing Then
            Return False
        End If

        If [GetType]() <> obj.GetType() Then
            Return False
        End If

        Dim pt As Point = CType(obj, Point)

        Return X = pt.X AndAlso Y = pt.Y

    End Function

End Class

O exemplo a seguir corrige a violação substituindo GetHashCode().

' This class satisfies the rule.
Public Class Point

    Public Property X As Integer
    Public Property Y As Integer

    Public Sub New(x As Integer, y As Integer)
        Me.X = x
        Me.Y = y
    End Sub

    Public Overrides Function GetHashCode() As Integer
        Return X Or Y
    End Function

    Public Overrides Function Equals(obj As Object) As Boolean

        If obj = Nothing Then
            Return False
        End If

        If [GetType]() <> obj.GetType() Then
            Return False
        End If

        Dim pt As Point = CType(obj, Point)

        Return Equals(pt)

    End Function

    Public Overloads Function Equals(pt As Point) As Boolean
        Return X = pt.X AndAlso Y = pt.Y
    End Function

    Public Shared Operator =(pt1 As Point, pt2 As Point) As Boolean
        Return pt1.Equals(pt2)
    End Operator

    Public Shared Operator <>(pt1 As Point, pt2 As Point) As Boolean
        Return Not pt1.Equals(pt2)
    End Operator

End Class

Confira também