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
¿Fue útil?

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
scroll top