190 messaggi dal 09 novembre 2005
Ciao a tutti,
uso quotidianamente controlli Telerik compreso JustCode, tra i vari suggerimenti del codice mi pone questa considerazione.

Ho fatto l'override di Equals del mio entity, JustCode mi suggerisce di fare anche quello di GetHashCode.

Ora mi domando se è veramente necessario e in quali casi.
E poi, come dovrei sostituire la gestione base di HashCode?

public override bool Equals(object obj)
{
  var other = obj as ClienteModel;
  return other != null && other.Codice == this.Codice;
}

public override int GetHashCode()
{
  return base.GetHashCode();
}
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
servono entrambi. Nella documentazione MSDN c'è una buona spiegazione:


Two objects that are equal return hash codes that are equal. However, the reverse is not true.
[...]
A hash code is intended for efficient insertion and lookup in collections that are based on a hash table.


In pratica, hai due metodi (GetHashCode e Equals) perché il primo offre al framework un modo veloce per trovare gli oggetti che *potrebbero* essere uguali. Equals viene usato in seconda battuta per confermare/smentire l'effettiva uguaglianza tra i due oggetti.

Ne trovi un esempio nel framework, all'interno dell'implementazione del metodo FindEntry di un comune Dictionary<TKey, TValue>.
https://referencesource.microsoft.com/#mscorlib/system/collections/generic/dictionary.cs,297

In particolare la linea 305:
if (entries[i].hashCode == hashCode && comparer.Equals(entries[i].key, key)) return i



come dovrei sostituire la gestione base di HashCode?

In questo caso particolare, dato che stai considerano uguali degli oggetti che hanno codice uguale, potresti semplicemente restituire l'hashcode del codice.

public override int GetHashCode()
{
  //Codice può essere null? In quel caso lo equipariamo a stringa vuota.
  return (this.Codice ?? "").GetHashCode();
}


ciao,
Moreno
Modificato da BrightSoul il 10 febbraio 2017 20.21 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.