Partager via


CA2218 : Remplacez GetHashCode au moment de remplacer Equals

Propriété Value
Identificateur de la règle CA2218
Titre Remplacez GetHashCode au moment de remplacer Equals
Catégorie Utilisation
Le correctif est cassant ou non cassant Sans rupture
Activé par défaut dans .NET 8 À titre de suggestion

Cause

Un type public se substitue à System.Object.Equals, mais pas à System.Object.GetHashCode.

Description de la règle

GetHashCode retourne une valeur fondée sur l’instance actuelle, adaptée aux algorithmes de hachage et aux structures de données telles que les tables de hachage. Deux objets de même type et égaux doivent retourner le même code de hachage pour garantir que les instances des types suivants fonctionnent correctement :

Remarque

Cette règle s’applique uniquement au code Visual Basic. Le compilateur C# génère un avertissement distinct, CS0659.

Comment corriger les violations

Pour corriger une violation de cette règle, fournissez une implémentation de GetHashCode. Pour une paire d’objets du même type, veillez à ce que l’implémentation retourne la même valeur si votre implémentation de Equals retourne true pour la paire.

Quand supprimer les avertissements

Ne supprimez aucun avertissement de cette règle.

Exemple de classe

L’exemple suivant montre une classe (type référence) qui enfreint cette règle.

' 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

L’exemple suivant corrige la violation en remplaçant 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

Voir aussi