CA2218: GetHashCode overschrijven bij het overschrijven van Equals
Eigenschappen | Weergegeven als |
---|---|
Regel-id | CA2218 |
Titel | GetHashCode overschrijven bij het overschrijven van equals |
Categorie | Gebruik |
Oplossing is brekend of niet-brekend | Niet-brekend |
Standaard ingeschakeld in .NET 9 | Als suggestie |
Oorzaak
Een openbaar type wordt overschreven System.Object.Equals , maar wordt niet overschreven System.Object.GetHashCode.
Beschrijving van regel
GetHashCode retourneert een waarde op basis van het huidige exemplaar dat geschikt is voor hash-algoritmen en gegevensstructuren zoals hashtabellen. Twee objecten die hetzelfde type zijn en gelijk zijn, moeten dezelfde hash-code retourneren om ervoor te zorgen dat exemplaren van de volgende typen correct werken:
- 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
- Typen die implementeren System.Collections.Generic.IEqualityComparer<T>
Notitie
Deze regel is alleen van toepassing op Visual Basic-code. De C#-compiler genereert een afzonderlijke waarschuwing, CS0659.
Schendingen oplossen
Als u een schending van deze regel wilt oplossen, geeft u een implementatie van GetHashCode. Voor een paar objecten van hetzelfde type moet u ervoor zorgen dat de implementatie dezelfde waarde retourneert als de implementatie van Equals retourneert true
voor het paar.
Wanneer waarschuwingen onderdrukken
Een waarschuwing van deze regel niet onderdrukken.
Voorbeeld van klasse
In het volgende voorbeeld ziet u een klasse (verwijzingstype) die deze regel schendt.
' 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
In het volgende voorbeeld wordt de schending opgelost door deze te overschrijven 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
Gerelateerde regels
- CA1046: Operator voor overbelasting is niet gelijk aan verwijzingstypen
- CA2224: Onderdrukking is gelijk aan overbelastingsoperator is gelijk aan
- CA2225: Overbelastingen van operatoren hebben alternatieve namen
- CA2226: Operators moeten symmetrische overbelastingen hebben
- CA2231: De operator Overbelasting is gelijk aan het overschrijven van ValueType.Equals