CA2218: Substituir GetHashCode ao substituir Equals
Property | valor |
---|---|
ID da regra | CA2218 |
Título | Substituir GetHashCode ao substituir Equals |
Categoria | Utilização |
A correção está quebrando ou não quebrando | Sem quebra |
Habilitado por padrão no .NET 9 | Como sugestão |
Motivo
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, que é adequado para algoritmos de hash e estruturas de dados, como tabelas de hash. Dois objetos que são do mesmo tipo e são 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>
Nota
Esta regra só se aplica ao código do Visual Basic. O compilador C# gera um aviso separado, CS0659.
Como corrigir violações
Para corrigir uma violação desta regra, forneça uma implementação do GetHashCode. Para um par de objetos do mesmo tipo, certifique-se de que a implementação retorna o mesmo valor se sua implementação de Equals retorna true
para o par.
Quando suprimir avisos
Não suprima um aviso desta 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()o .
' 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 conexas
- CA1046: Não sobrecarregar operador igual em tipos de referência
- CA2224: Substituição é igual a sobrecarga do operador
- CA2225: As sobrecargas do operador nomearam suplentes
- CA2226: Os operadores devem ter sobrecargas simétricas
- CA2231: Operador de sobrecarga é igual ao substituir ValueType.Equals