GetHashCode sur les champs null?
Comment dois-je traiter avec les champs null dans GetHashCode
fonction?
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
- XORing n'est pas une bonne façon de combiner des codes de hachage. Pour une approche plus solide, voir stackoverflow.com/questions/263400/...
Vous devez vous connecter pour publier un commentaire.
Que Jeff Yates a suggéré, le remplacer dans la réponse serait de donner la même valeur de hachage pour (nom = null, adresse = "foo") en tant que (nom = "toto", address = null). Ces le besoin d'être différent. Comme suggéré dans le lien, quelque chose de semblable à la suivante serait mieux.
Quel est le meilleur algorithme pour un substituée Système.Objet.GetHashCode?
(Name == null ? 0 : Name.GetHashCode())
peuvent être résumés à(Foo?.GetHashCode() ?? 0)
en C# 7Généralement, vous devez vérifier la nullité et de l'utilisation de 0 pour cette "partie" du code de hachage si le champ est null:
(pardon pour le C#-ism, pas sûr de la valeur null chèque équivalent en VB)
GetHashCode()
qui existe dansSystem.Int32
retourne simplement l'entier lui-même. Dans ce casContactId.GetHashCode()
est le même que justeContactId
lorsque le type deContactId
estint
. bien sûr, vous ne savez jamais si la mise en œuvre va changer dans les futures versions de .NET.