Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
| Proprietà | valore |
|---|---|
| ID regola | CA2218 |
| Title | Eseguire l'override di GetHashCode quando si esegue l'override di Equals |
| Categoria | Utilizzo |
| La correzione causa un'interruzione o meno | Non causa un'interruzione |
| Abilitato per impostazione predefinita in .NET 10 | Come suggerimento |
| Linguaggi applicabili | Visual Basic |
Causa
Un tipo pubblico esegue l'override di System.Object.Equals ma non esegue l'override di System.Object.GetHashCode.
Descrizione regola
GetHashCode restituisce un valore, in base all'istanza corrente, adatto per algoritmi hash e strutture di dati, ad esempio tabelle hash. Due oggetti che sono dello stesso tipo e sono uguali devono restituire lo stesso codice hash per garantire che le istanze dei tipi seguenti funzionino correttamente:
- 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
- Tipi che implementano System.Collections.Generic.IEqualityComparer<T>
Nota
Questa regola si applica solo al codice Visual Basic. Il compilatore C# genera un avviso separato, CS0659.
Come correggere le violazioni
Per correggere una violazione di questa regola, fornire un'implementazione di GetHashCode. Per una coppia di oggetti dello stesso tipo, assicurarsi che l'implementazione restituisca lo stesso valore se l'implementazione di Equals restituisce true per la coppia.
Quando eliminare gli avvisi
Non sopprimere un avviso di questa regola.
Esempio di classe
Nell'esempio seguente viene illustrata una classe (tipo riferimento) che viola questa regola.
' 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
Nell'esempio seguente viene risolta la violazione eseguendo l'override di 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
Regole correlate
- CA1046: Non eseguire l'overload dell'operatore "uguale a" per i tipi di riferimento
- CA2224: Eseguire l'override del metodo Equals quando si sovraccarica l'operatore di uguaglianza
- CA2225: I sovraccarichi degli operatori hanno alternative denominate
- CA2226: Gli operatori dovrebbero avere sovraccarichi simmetrici
- CA2231: Eseguire l'overload dell'operatore di uguaglianza al momento dell'override di ValueType.Equals