null nullreferenceexception equality gethashcode iequatable

null - gethashcode in c#



GetHashCode en campos nulos? (2)

¿Cómo trato con los campos nulos en la función 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


Como sugirió Jeff Yates, la anulación de la respuesta daría el mismo hash para (nombre = nulo, dirección = "foo") como (nombre = "foo", dirección = nulo). Estos tienen que ser diferentes. Como se sugiere en el enlace, algo similar a lo siguiente sería mejor.

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

¿Cuál es el mejor algoritmo para un System.Object.GetHashCode anulado?


Por lo general, se comprueba si hay un valor nulo y se usa 0 para esa "parte" del código hash si el campo es nulo:

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

(perdone el C # -ism, no estoy seguro del equivalente de cheque nulo en VB)