È necessario sovrascrivere gli operatori == e! = Durante l'override del metodo Equals? (.NETTO)
-
10-07-2019 - |
Domanda
O è consigliabile farlo? Perché?
Soluzione
Consulta le linee guida per la sostituzione di Equals () e operator == .
Quote:
Per impostazione predefinita, l'operatore == verifica l'uguaglianza di riferimento determinando se due riferimenti indicano lo stesso oggetto. Pertanto, i tipi di riferimento non devono implementare operator == per ottenere questa funzionalità. Quando un tipo è immutabile, cioè i dati contenuti nell'istanza non possono essere modificati, sovraccaricare l'operatore == per confrontare l'uguaglianza di valore anziché l'uguaglianza di riferimento può essere utile perché, come oggetti immutabili, possono essere considerati uguali a lungo in quanto hanno lo stesso valore. Non è una buona idea sovrascrivere operator == in tipi non immutabili.
In sostanza:
Se vuoi che == e! = si comportino come Equals (..)
e ! Equals (..)
devi implementare gli operatori. In genere lo fai solo con tipi immutabili.
Altri suggerimenti
Vedi Linee guida per l'implementazione di Equals and the Equality Operator ( ==)
Per i tipi di valore (strutture) " Implementare == ogni volta che si sostituisce il metodo Equals "
Per i tipi di riferimento (classi), "La maggior parte dei tipi di riferimento, anche quelli che implementano il metodo Equals, non devono sovrascrivere ==. " L'eccezione è per le classi immutabili e quelle con semantica simile al valore.
Oltre a tutte le risposte già qui, non dimenticare di assicurarti che GetHashCode ()
sia coerente.
Se stai ignorando il metodo equals e vuoi comunque essere in grado di verificare l'uguaglianza (o la disuguaglianza), probabilmente dovresti ignorare anche i metodi == e! =.
Sarebbe consigliabile, poiché sarebbe inaspettato se:
if (foo == bar)
... si è comportato diversamente da:
if (foo.Equals(bar))
Non è necessario, nessuno ti ucciderà se non lo fai.
Tuttavia, tieni presente che spesso è più naturale scrivere (A == B) rispetto a A.Equals (B). Se fornisci entrambi i metodi, sarà più facile per i consumatori del tuo codice.
in A.Equals (B) A non può essere nullo in A == B può essere nullo
Sostituire == per farlo chiamare Equals mi sembra un'idea generalmente negativa per i tipi di riferimento. Se esegui l'override di == per farlo chiamare Equals, allora non penso che un utente del tuo codice possa provare se due riferimenti a oggetti si riferiscono allo stesso identico oggetto (rispetto a un oggetto con proprietà uguali).
Se le persone vogliono testare le istanze delle tue classi per l'uguaglianza dei valori, sicuramente dovrebbero semplicemente chiamare Equals, risparmiando == per testare in modo specifico l'uguaglianza di riferimento.
Non è necessario, ma una cosa intelligente da fare.
Se stai creando un framework e un altro sviluppatore diverso da quello che stai per usare l'oggetto, dovresti sovrascrivere == e! =. In questo modo quando uno sviluppatore può usarlo, almeno hanno la logica giusta per confrontare i 2 oggetti piuttosto che essere gli stessi in memoria.
Mi assicurerei che il tuo == & amp; ! = chiama il tuo metodo uguale.