Non è necessario implementarlo. Se scrivi il tuo metodo Equals(), ti consiglio di utilizzare alcune implementazioni GetHashCode che non interrompano però HashSet. Ad esempio, è possibile restituire un valore statico (in genere 42). Le prestazioni di HashSet si ridurranno notevolmente, ma almeno funzionerà ancora - non saprai mai chi utilizzerà/modificherà/manterrà il tuo codice in futuro. (Edit: si consiglia di registrare un avviso se una classe viene utilizzata in una struttura di hash per i problemi di prestazioni primi spot)
EDIT: non solo usare XOR per combinare codici hash delle vostre proprietà
È già stato detto da altri che puoi semplicemente combinare i codici hash di tutte le tue proprietà. Invece di usare solo XOR, incoraggerei comunque a moltiplicare i risultati. XOR può generare un valore 0 se entrambi i valori sono uguali (ad esempio 0xA^0xA == 0x0
). Questo può essere facilmente migliorato utilizzando 0xA * 0xA
, 0xA * 31 + 0xA
o 0xA^(0xA * 31)
.
Tuttavia, l'intento della mia risposta è che qualsiasi funzione di hash è migliore di quella che non è coerente con gli uguali - anche se restituisce solo un valore statico. Seleziona semplicemente un sottoinsieme di proprietà (da none a tutti) che usi per l'uguaglianza e genera i risultati insieme. Mentre si selezionano le proprietà per il codice hash, preferisco quei piccoli sottoinsiemi che combinazioni sono piuttosto unici (es. Nome, cognome, compleanno - non è necessario aggiungere l'intero indirizzo)
Dai un'occhiata a Essential C# 4.0 (o precedente se ne hai già) nel capitolo 9 * Tipi ben formati * e saprai quando sovrascriverlo. – Oliver