CA2218: Přepište GetHashCode při přepsání Equals
Vlastnost | Hodnota |
---|---|
ID pravidla | CA2218 |
Název | Přepište GetHashCode při přepsání Equals |
Kategorie | Využití |
Oprava způsobující chybu nebo chybu způsobující chybu | Nenarušující |
Povoleno ve výchozím nastavení v .NET 9 | Jako návrh |
Příčina
Veřejný typ přepisuje System.Object.Equals , ale nepřepíše System.Object.GetHashCode.
Popis pravidla
GetHashCode vrátí hodnotu založenou na aktuální instanci, která je vhodná pro algoritmy hash a datové struktury, jako jsou tabulky hash. Dva objekty, které jsou stejného typu a jsou stejné, musí vrátit stejný hash kód, aby instance následujících typů fungovaly správně:
- 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, které implementují System.Collections.Generic.IEqualityComparer<T>
Poznámka:
Toto pravidlo platí jenom pro kód jazyka Visual Basic. Kompilátor jazyka C# vygeneruje samostatné upozornění CS0659.
Jak opravit porušení
Chcete-li opravit porušení tohoto pravidla, poskytněte implementaci GetHashCode. Pro dvojici objektů stejného typu se ujistěte, že implementace vrátí stejnou hodnotu, pokud vaše implementace Equals vrátí true
hodnotu pro dvojici.
Kdy potlačit upozornění
Nepotlačujte upozornění na toto pravidlo.
Příklad třídy
Následující příklad ukazuje třídu (typ odkazu), která porušuje toto pravidlo.
' 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
Následující příklad opravuje porušení přepsáním 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
Související pravidla
- CA1046: Nepřetěžujte operátory rovnosti na odkazových typech
- CA2224: Přepište Equals při přetížení operátoru rovnosti
- CA2225: Přetížení operátoru mají pojmenované alternativy
- CA2226: Operátory by měly mít symetrické přetížení
- CA2231: Přetižte operátor equals při přepsání ValueType.Equals