如何处理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
发布于 2017-01-31 05:39:44
正如Jeff Yates所建议的,答案中的覆盖将为(name = null,address = "foo")提供与(name = "foo",address = null)相同的散列。这些需要有所不同。正如link中所建议的,类似于下面的内容会更好。
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?
发布于 2010-03-15 10:38:14
通常,您检查null,如果字段为null,则使用0作为散列代码的“部分”:
return (Name == null ? 0 : Name.GetHashCode()) ^
(Address == null ? 0 : Address.GetHashCode());
(请原谅C#-ism,不确定在VB中是否有null检查等效项)
https://stackoverflow.com/questions/2444748
复制相似问题