CA2218: Substituir GetHashCode ao substituir Equals
Property | Valor |
---|---|
ID da regra | CA2218 |
Título | Substituir GetHashCode ao substituir Equals |
Categoria | Usage |
Correção interruptiva ou sem interrupção | Sem interrupção |
Habilitado por padrão no .NET 8 | Como sugestão |
Causa
Um tipo público substitui System.Object.Equals, mas não substitui System.Object.GetHashCode.
Descrição da regra
GetHashCode retorna um valor, com base na instância atual, adequado para algoritmos de hash e estruturas de dados, como tabelas de hash. Dois objetos do mesmo tipo e iguais devem retornar o mesmo código hash para garantir que as instâncias dos seguintes tipos funcionem corretamente:
- 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
- Tipos que implementam System.Collections.Generic.IEqualityComparer<T>
Observação
Essa regra é aplicável comente ao código do Visual Basic. O compilador C# gera um aviso separado, CS0659.
Como corrigir violações
Para corrigir uma violação dessa regra, forneça uma implementação de GetHashCode. Para um par de objetos do mesmo tipo, certifique-se de que a implementação retorne o mesmo valor se sua implementação de Equals retornar true
para o par.
Quando suprimir avisos
Não suprima um aviso nessa regra.
Exemplo de classe
O exemplo a seguir mostra uma classe (tipo de referência) que viola essa regra.
' 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
O exemplo a seguir corrige a violação substituindo 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
Regras relacionadas
- CA1046: Não sobrecarregar o operador equals em tipos de referência
- CA2224: Substituir equals ao sobrecarregar operador equals
- CA2225: Sobrecargas de operador têm alternativas nomeadas
- CA2226: Operadores devem ter sobrecargas simétricas
- CA2231: Sobrecarregar operador equals ao substituir ValueType.Equals