GetHashCode on null fields?
How do I deal with null fields in GetHashCode function?
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 Int开发者_运维技巧eger
      Return Name.GetHashCode Xor Address.GetHashCode
    End Function
  End Class
End Module
Typically, you check for null and use 0 for that "part" of the hash code if the field is null:
return (Name == null ? 0 : Name.GetHashCode()) ^ 
  (Address == null ? 0 : Address.GetHashCode());
(pardon the C#-ism, not sure of the null check equivalent in VB)
As Jeff Yates suggested, the override in the answer would give the same hash for (name = null, address = "foo") as (name = "foo", address = null). These need to be different. As suggested in link, something similar to the following would be better.
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;
}
What is the best algorithm for an overridden System.Object.GetHashCode?
 
         加载中,请稍侯......
 加载中,请稍侯......
      
精彩评论