Share via


CA2218: Invalidar el método GetHashCode al invalidar el método Equals

Propiedad Value
Identificador de la regla CA2218
Título Invalidar el método GetHashCode al invalidar el método Equals
Categoría Uso
La corrección es problemática o no problemática Poco problemático
Habilitado de forma predeterminada en .NET 8 Como sugerencia

Causa

Un tipo público invalida System.Object.Equals, pero no System.Object.GetHashCode.

Descripción de la regla

GetHashCode devuelve un valor basado en la instancia actual que es adecuado para los algoritmos hash y las estructuras de datos como las tablas hash. Dos objetos que son del mismo tipo y son iguales deben devolver el mismo código hash para garantizar que las instancias de los tipos siguientes funcionen correctamente:

Nota

Esta regla solo se aplica al código de Visual Basic. El compilador de C# genera una advertencia independiente, CS0659.

Cómo corregir infracciones

Para corregir una infracción de esta regla, proporcione una implementación de GetHashCode. Para un par de objetos del mismo tipo, asegúrese de que la implementación devuelva el mismo valor si la implementación de Equals devuelve true para el par.

Cuándo suprimir las advertencias

No suprima las advertencias de esta regla.

Ejemplo de clase

En el ejemplo siguiente se muestra una clase (tipo de referencia) que infringe esta regla.

' 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

En el ejemplo siguiente se corrige la infracción mediante el reemplazo de 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

Consulte también