質問

私は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;
}

ための最良のアルゴリズムは何ですか上書きSystem.Object.GetHashCodeですか

他のヒント

フィールドがnullの場合、通常、あなたがnullをチェックし、ハッシュコードの「一部」に0を使用します:

return (Name == null ? 0 : Name.GetHashCode()) ^ 
  (Address == null ? 0 : Address.GetHashCode());

(VBでヌルチェックと同等の確認、C#の-ismはない恩赦)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top