CA2218: Zastąp GetHashCode przy przesłanianiu Equals
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA2218 |
Tytuł | Przesłaniaj metodę GetHashCode w razie przesłaniania metody Equals |
Kategoria | Użycie |
Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
Domyślnie włączone na platformie .NET 9 | Jako sugestia |
Przyczyna
Przesłonięć System.Object.Equals typu publicznego, ale nie zastępuje System.Object.GetHashCodeelementu .
Opis reguły
GetHashCode Zwraca wartość opartą na bieżącym wystąpieniu, która jest odpowiednia dla algorytmów wyznaczania wartości skrótu i struktur danych, takich jak tabele skrótów. Dwa obiekty, które są tego samego typu i są równe, muszą zwrócić ten sam kod skrótu, aby upewnić się, że wystąpienia następujących typów działają poprawnie:
- 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
- Typy implementujące System.Collections.Generic.IEqualityComparer<T>
Uwaga
Ta reguła dotyczy tylko kodu Visual Basic. Kompilator języka C# generuje oddzielne ostrzeżenie CS0659.
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, podaj implementację elementu GetHashCode. W przypadku pary obiektów tego samego typu upewnij się, że implementacja zwraca tę samą wartość, jeśli implementacja Equals zwraca wartość true
dla pary.
Kiedy pomijać ostrzeżenia
Nie pomijaj ostrzeżeń dla tej reguły.
Przykład klasy
W poniższym przykładzie przedstawiono klasę (typ odwołania), która narusza tę regułę.
' 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
Poniższy przykład naprawia naruszenie przez zastąpienie .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
Powiązane reguły
- CA1046: Nie przeciążaj operatora równości w typach referencyjnych
- CA2224: Przesłaniaj metodę Equals w przypadku przeciążania operacji równości operatorów
- CA2225: Przeciążenia operatora mają nazwane alternatywy
- CA2226: Operatory powinny mieć symetryczne przeciążenia
- CA2231: Przeciążaj operator równości w przypadku przesłaniania metody ValueType.Equals