GetHashCode en campos nulos?
-
20-09-2019 - |
Pregunta
¿Cómo puedo lidiar con los campos nulos en función GetHashCode
?
Module Module1
Sub Main()
Dim c As New Contact
Dim hash = c.GetHashCode
End Sub
Public Class Contact : Implements IEquatable(Of Contact)
Public Name As String
Public Address As String
Public Overloads Function Equals(ByVal other As Contact) As Boolean _
Implements System.IEquatable(Of Contact).Equals
Return Name = other.Name AndAlso Address = other.Address
End Function
Public Overrides Function Equals(ByVal obj As Object) As Boolean
If ReferenceEquals(Me, obj) Then Return True
If TypeOf obj Is Contact Then
Return Equals(DirectCast(obj, Contact))
Else
Return False
End If
End Function
Public Overrides Function GetHashCode() As Integer
Return Name.GetHashCode Xor Address.GetHashCode
End Function
End Class
End Module
Solución
Como sugirió Jeff Yates, la anulación de la respuesta daría el mismo hash para (nombre = null, dirección = "foo") como (name = "foo", dirección = null). Estos tienen que ser diferentes. Como se sugiere en enlace, algo similar a lo siguiente sería mejor.
public override int GetHashCode()
{
unchecked // Overflow is fine, just wrap
{
int hash = 17;
hash = hash * 23 + (Name == null ? 0 : Name.GetHashCode());
hash = hash * 23 + (Address == null ? 0 : Address.GetHashCode());
}
return hash;
}
¿Cuál es el mejor algoritmo para una System.Object.GetHashCode reemplazado?
Otros consejos
Por lo general, comprueba si hay nula y utiliza 0 para que "parte" del código hash si el campo es nulo:
return (Name == null ? 0 : Name.GetHashCode()) ^
(Address == null ? 0 : Address.GetHashCode());
(perdón por el C # ismo, no está seguro del cheque nulo equivalente en VB)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow