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 10 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