CA2218: A GetHashCode felülbírálása egyenlők felülbírálásakor
Tulajdonság | Érték |
---|---|
Szabályazonosító | CA2218 |
Cím | GetHashCode felülbírálása egyenlők felülbírálásakor |
Kategória | Használat |
A javítás kompatibilitástörő vagy nem törik | Nem törés |
Alapértelmezés szerint engedélyezve a .NET 8-ban | Javaslatként |
Ok
Nyilvános típusú felülbírálások System.Object.Equals , de nem felülbírálják System.Object.GetHashCode.
Szabály leírása
GetHashCode Az aktuális példányon alapuló értéket ad vissza, amely megfelel a kivonatoló algoritmusoknak és adatstruktúráknak, például kivonattábláknak. Két azonos típusú és egyenlő objektumnak ugyanazt a kivonatkódot kell visszaadnia, hogy a következő típusok példányai megfelelően működjenek:
- 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
- Implementálható típusok System.Collections.Generic.IEqualityComparer<T>
Megjegyzés:
Ez a szabály csak a Visual Basic-kódra vonatkozik. A C#-fordító külön figyelmeztetést hoz létre, a CS0659-et.
Szabálysértések kijavítása
A szabály megsértésének kijavításához adja meg a szabály implementálását GetHashCode. Egy azonos típusú objektumpár esetében győződjön meg arról, hogy az implementáció ugyanazt az értéket adja vissza, ha a pár visszatérési Equals értéke megegyezik true
.
Mikor kell letiltani a figyelmeztetéseket?
Ne tiltsa el a szabály figyelmeztetését.
Példa osztályra
Az alábbi példa egy olyan osztályt (referenciatípust) mutat be, amely megsérti ezt a szabályt.
' 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
Az alábbi példa felülírással oldja meg a szabálysértést 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
Kapcsolódó szabályok
- CA1046: Ne terhelje túl az operátort a referenciatípusoknál
- CA2224: A felülbírálás egyenlő a túlterhelési operátor egyenlő
- CA2225: Az operátorok túlterhelései alternatívokat neveztek el
- CA2226: Az operátoroknak szimmetrikus túlterhelésekkel kell rendelkezniük
- CA2231: A túlterhelési operátor egyenlő a ValueType.Equals felülbírálásával
Kapcsolódó információk
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: