CA2218: GetHashCode beim Überschreiben von Equals überschreiben.
Eigenschaft | Wert |
---|---|
Regel-ID | CA2218 |
Titel | GetHashCode beim Überschreiben von Equals überschreiben. |
Kategorie | Verwendung |
Fix führt oder führt nicht zur Unterbrechung | Nicht unterbrechend |
Standardmäßig in .NET 8 aktiviert | Als Vorschlag |
Ursache
Ein öffentlicher Typ überschreibt System.Object.Equals, jedoch nicht System.Object.GetHashCode.
Regelbeschreibung
GetHashCode gibt einen Wert auf der Grundlage der aktuellen Instanz zurück, der sich für Hashalgorithmen und Datenstrukturen eignet, z. B. für Hashtabellen. Zwei Objekte, die den gleichen Typ und Wert aufweisen, müssen auch den gleichen Hashcode zurückgeben. So wird sichergestellt, dass die Instanzen der folgenden Typen ordnungsgemäß funktionieren:
- 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 System.Collections.Generic.IEqualityComparer<T> implementieren
Hinweis
Diese Regel gilt nur für Visual Basic-Code. Der C#-Compiler generiert eine andere Warnung, CS0659.
Behandeln von Verstößen
Implementieren Sie eine Instanz von GetHashCode, um einen Verstoß gegen diese Regel zu korrigieren. Wenn ein Objektpaar den gleichen Typ aufweist, müssen Sie dafür sorgen, dass die Implementierung den gleichen Wert zurückgibt, wenn Ihre Implementierung von Equals den Wert true
für das Paar zurückgibt.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie keine Warnung dieser Regel.
Klassenbeispiel
Das folgende Beispiel zeigt eine Klasse (Verweistyp), die gegen diese Regel verstößt.
' 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
Im folgenden Beispiel wird der Verstoß durch das Überschreiben von GetHashCode() korrigiert.
' 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
Ähnliche Regeln
- CA1046: Gleichheitsoperator für Referenztypen nicht überladen.
- CA2224: Equals beim Überladen von Gleichheitsoperatoren überschreiben.
- CA2225: Operatorüberladungen weisen benannte Alternativen auf.
- CA2226: Operatoren sollten symmetrische Überladungen aufweisen.
- CA2231: Überladen Sie den Gleichheitsoperator beim Überschreiben von ValueType.Equals.