CA2218: Åsidosätt GetHashCode vid åsidosättande av lika med
Property | Värde |
---|---|
Regel-ID | CA2218 |
Title | Åsidosätt GetHashCode vid åsidosättande av lika med |
Kategori | Användning |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Som förslag |
Orsak
En offentlig typ åsidosätter men åsidosätter System.Object.Equals System.Object.GetHashCodeinte .
Regelbeskrivning
GetHashCode returnerar ett värde, baserat på den aktuella instansen, som passar för hash-algoritmer och datastrukturer som hash-tabeller. Två objekt som är av samma typ och är lika måste returnera samma hash-kod för att säkerställa att instanser av följande typer fungerar korrekt:
- 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
- Typer som implementerar System.Collections.Generic.IEqualityComparer<T>
Kommentar
Den här regeln gäller endast för Visual Basic-kod. C#-kompilatorn genererar en separat varning, CS0659.
Så här åtgärdar du överträdelser
Om du vill åtgärda ett brott mot den här regeln anger du en implementering av GetHashCode. För ett par objekt av samma typ kontrollerar du att implementeringen returnerar samma värde om implementeringen av Equals returnerar true
för paret.
När du ska ignorera varningar
Ignorera inte en varning från den här regeln.
Klassexempel
I följande exempel visas en klass (referenstyp) som bryter mot den här regeln.
' 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
I följande exempel åtgärdas överträdelsen genom att GetHashCode()åsidosätta .
' 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
Relaterade regler
- CA1046: Överlagrar inte operatorn är lika med referenstyper
- CA2224: Åsidosättning är lika med överlagringsoperatorn lika med
- CA2225: Operatoröverlagringar har namngett alternativ
- CA2226: Operatorer bör ha symmetriska överlagringar
- CA2231: Överlagringsoperatorn är lika med vid åsidosättande av ValueType.Equals