Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
| Właściwości | Wartość |
|---|---|
| Identyfikator reguły | CA2218 |
| Tytuł | Przesłaniaj metodę GetHashCode w razie przesłaniania metody Equals |
| Kategoria | Użycie |
| Poprawka jest powodująca problemy lub niepowodująca problemów | Niezgodność |
| Domyślnie włączone na platformie .NET 10 | Jako sugestia |
| Zastosowane języki | Visual Basic |
Przyczyna
Publiczny typ przesłania System.Object.Equals, ale nie zastępuje System.Object.GetHashCode elementu.
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 zapewnić poprawne działanie instancji następujących typów.
- 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 poprzez nadpisanie 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 porównania w typach referencyjnych
- CA2224: Przesłaniaj metodę equals w przypadku przeciążania operatora równości
- CA2225: Przeciążenia operatora mają nazwane alternatywy
- CA2226: Operatory powinny mieć symetryczne przeciążenia
- CA2231: Przeciąż operator równości w przypadku przesłaniania metody ValueType.Equals