Partilhar via


CA2218: Substituir GetHashCode ao substituir Equals

Property valor
ID da regra CA2218
Título Substituir GetHashCode ao substituir Equals
Categoria Utilização
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 8 Como sugestão

Motivo

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, que é adequado para algoritmos de hash e estruturas de dados, como tabelas de hash. Dois objetos que são do mesmo tipo e são iguais devem retornar o mesmo código hash para garantir que as instâncias dos seguintes tipos funcionem corretamente:

Nota

Esta regra só se aplica ao código do Visual Basic. O compilador C# gera um aviso separado, CS0659.

Como corrigir violações

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

Quando suprimir avisos

Não suprima um aviso desta 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()o .

' 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

Consulte também