Domanda

O è consigliabile farlo? Perché?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top