Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
| Propriété | Valeur |
|---|---|
| Identificateur de la règle | CA2218 |
| Titre | Remplacez GetHashCode lors de la redéfinition de Equals |
| Catégorie | Utilisation |
| Le correctif est impactant ou sans impact | Sans rupture |
| Activé par défaut dans .NET 10 | À titre de suggestion |
| Langues applicables | Visual Basic |
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 :
- System.Collections.Hashtable
- System.Collections.SortedList
- System.Collections.Generic.Dictionary<TKey,TValue>
- System.Collections.Generic.SortedDictionary<TKey,TValue>
- System.Collections.Generic.SortedList<TKey,TValue>
- System.Collections.Specialized.HybridDictionary
- System.Collections.Specialized.ListDictionary
- System.Collections.Specialized.OrderedDictionary
- Types qui implémentent System.Collections.Generic.IEqualityComparer<T>
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
Règles associées
- CA1046 : Ne surchargez pas l’opérateur d'égalité pour les types de référence
- CA2224 : Remplacez Equals lorsque l'opérateur égal est surchargé
- CA2225 : Les surcharges d'opérateur ont des alternatives nommées
- CA2226 : Les opérateurs doivent avoir des surcharges symétriques
- CA2231 : Surchargez l’opérateur égal (equals) en remplaçant ValueType.Equals