ヌルフィールド上のGetHashCodeメソッド?
-
20-09-2019 - |
質問
私は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
解決
ジェフ・イェーツが示唆したように、答えでオーバーライドは(名前= nullを、アドレス=「foo」という)として(名前=「foo」という、アドレス= null)のために同じハッシュを与えるだろう。これらは、異なるようにする必要があります。リンクで示唆したように、次のようなものが良いだろう。
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;
}
他のヒント
フィールドがnullの場合、通常、あなたがnullをチェックし、ハッシュコードの「一部」に0を使用します:
return (Name == null ? 0 : Name.GetHashCode()) ^
(Address == null ? 0 : Address.GetHashCode());
(VBでヌルチェックと同等の確認、C#の-ismはない恩赦)
所属していません StackOverflow