CA2218: Invalidar el método GetHashCode al invalidar el método Equals
Propiedad | Value |
---|---|
Identificador de la regla | CA2218 |
Título | Invalidar el método GetHashCode al invalidar el método Equals |
Categoría | Uso |
La corrección es problemática o no problemática | Poco problemático |
Habilitado de forma predeterminada en .NET 9 | Como sugerencia |
Causa
Un tipo público invalida System.Object.Equals, pero no System.Object.GetHashCode.
Descripción de la regla
GetHashCode devuelve un valor basado en la instancia actual que es adecuado para los algoritmos hash y las estructuras de datos como las tablas hash. Dos objetos que son del mismo tipo y son iguales deben devolver el mismo código hash para garantizar que las instancias de los tipos siguientes funcionen correctamente:
- 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 implementan System.Collections.Generic.IEqualityComparer<T>
Nota
Esta regla solo se aplica al código de Visual Basic. El compilador de C# genera una advertencia independiente, CS0659.
Cómo corregir infracciones
Para corregir una infracción de esta regla, proporcione una implementación de GetHashCode. Para un par de objetos del mismo tipo, asegúrese de que la implementación devuelva el mismo valor si la implementación de Equals devuelve true
para el par.
Cuándo suprimir las advertencias
No suprima las advertencias de esta regla.
Ejemplo de clase
En el ejemplo siguiente se muestra una clase (tipo de referencia) que infringe esta regla.
' 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
En el ejemplo siguiente se corrige la infracción mediante el reemplazo de 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
Reglas relacionadas
- CA1046: No sobrecargar el operador de igualdad en los tipos de referencia
- CA2224: Invalidar Equals al sobrecargar operadores de igualdad
- CA2225: Las sobrecargas del operador tienen alternativas con nombre
- CA2226: Los operadores deben tener sobrecargas simétricas
- CA2231: Sobrecargar el operador equals al invalidar ValueType.Equals