Oppure è consigliabile farlo? Perché?È necessario sovrascrivere gli operatori == e! = Quando si esegue l'override del metodo Equals? (.NET)
risposta
Vedere guidelines for overriding Equals() and operator==.
Quota:
Per default, l'operatore == test per l'uguaglianza di riferimento per determinare se due riferimenti indicano lo stesso oggetto. Pertanto, i tipi di riferimento non devono implementare l'operatore == per ottenere questa funzionalità. Quando un tipo è immutabile, cioè i dati contenuti nell'istanza non possono essere modificati, l'operatore di overload == per confrontare l'uguaglianza del valore anziché l'uguaglianza di riferimento può essere utile perché, come oggetti immutabili, possono essere considerati uguali a quelli lunghi come hanno lo stesso valore. Non è una buona idea sovrascrivere l'operatore == in tipi non immutabili.
In sostanza:
Se volete == e = a comportarsi come Equals(..)
e !Equals(..)
è necessario implementare gli operatori. In genere lo fai solo con tipi immutabili.
Se si esegue l'override del metodo di uguaglianza e si desidera comunque essere in grado di verificare l'uguaglianza (o la disuguaglianza), è consigliabile sovrascrivere anche i metodi == e! =.
Non è necessario, ma una cosa intelligente da fare.
Se si sta creando un framework e un altro sviluppatore diverso da quello che si utilizzerà l'oggetto, è necessario eseguire l'override di == e! =. In questo modo, quando uno sviluppatore può usarlo, hanno almeno la logica giusta per confrontare i 2 oggetti anziché essere uguali in memoria.
Mi piacerebbe che il tuo == &! = Chiami il tuo metodo di parità.
Vedi Guidelines for Implementing Equals and the Equality Operator (==)
Per Tipi di valore (le strutture) "Attuare == ogni volta che l'override del metodo Equals"
Per i tipi di riferimento (classi), "La maggior parte dei tipi di riferimento, anche quelli che implementano le Equals metodo, non dovrebbe sovrascrivere ==. " L'eccezione è per le classi immutabili e quelle con semantica di valore.
sarebbe opportuno, come sarebbe inaspettata se:
if (foo == bar)
... si sono comportati in modo diverso a:
if (foo.Equals(bar))
Ci sono molti casi in cui 'foo == bar' si comporta diversamente da' foo.Equals (bar) '. Una credenza sbagliata nella loro equivalenza è suscettibile di causare molti problemi piuttosto che riconoscere che non possono sempre comportarsi allo stesso modo e non ci si dovrebbe aspettare [anzi, il Framework ha alcune incongruenze in ciò che significa "Equals" che deriva da un IMHO malriposto desiderio di fallo corrispondere a '==']. – supercat
@supercat un buon esempio è quando si confrontano i tipi nullable, Equals è intelligente e controlla HasValue per ogni lato. – Gary
@Gary: stavo pensando più a cose come 'Decimal'. È utile avere un mezzo di paragone che consideri gli oggetti classificati come uguali se nessuno dei due si trova sopra l'altro, ma è anche utile avere un mezzo per test di uguaglianza che possa riconoscere oggetti ugualmente ordinati (ad esempio 1,0 d e 1,00 d) come distinti. IMHO, tali oggetti dovrebbero produrre risultati di confronto opposti con '==' e '.Equalisti'. – supercat
Non è necessario, nessuno ti ucciderà se non lo fai Fai quello.
Tuttavia, si noti che è spesso più naturale scrivere (A == B) di A.Equal (B). Se fornisci entrambi i metodi, sarà più facile per i consumatori del tuo codice.
Oltre a tutte le risposte già disponibili, non dimenticare di garantire che lo standard GetHashCode()
sia coerente.
in A.Uguale (B) A non può essere nullo in A == B può essere nullo
Ignorare == per chiamare Chiama mi sembra una cattiva idea per i tipi di riferimento. Se si esegue l'override == per chiamare Chiama Equals, non penso che esista un modo per un utente del codice per verificare se due riferimenti a oggetti si riferiscono allo stesso oggetto esatto (rispetto a un oggetto con proprietà uguali).
Se le persone vogliono testare le istanze delle classi per l'uguaglianza di valore, allora sicuramente dovrebbero chiamare Equals, salvando == per testare specificamente l'uguaglianza di riferimento.
È possibile utilizzare 'Object.ReferenceEquals' per controllare in modo specifico l'uguaglianza di riferimento. –
Aha, grazie Sebastian - Non lo sapevo. –
Sebbene sia possibile utilizzare 'Object.ReferenceEquals', è piuttosto goffo. Considero l'uso di C# del token '==' per entrambi gli operatori di overload-uguaglianza-test e di uguaglianza di riferimento come uno dei più grandi errori di progettazione nella lingua. – supercat
- 1. Quando è necessario sovrascrivere i metodi equals e hashcode?
- 2. sovraccarico + =, +, == e = gli operatori
- 3. I "si" parola chiave e la forzatura del metodo Equals
- 4. Perché è necessario utilizzare gli operatori di spostamento in java?
- 5. Cosa può andare storto se non si riesce a sovrascrivere GetHashCode() quando si esegue l'override di Equals()?
- 6. Perché dobbiamo sovrascrivere il metodo equals() in Java?
- 7. Dovremmo sovrascrivere sempre gli uguali?
- 8. TreeSet utilizza internamente TreeMap, quindi è necessario implementare il metodo Hashcode quando si utilizza Treeset
- 9. Quando è necessario utilizzare gli operatori impliciti ed espliciti in C#?
- 10. Ottimizzazione metodo equals()
- 11. Comportamento diverso tra gli operatori CString "+ =" e "+"
- 12. Implementazione del metodo equals in java
- 13. R: conserva l'ordine quando si utilizzano gli operatori corrispondenti (% in%)
- 14. esegue il metodo (magico) quando il metodo esistente è chiamato
- 15. Come si sopprime l'avviso del linker quando si esegue l'override di un metodo di istanza di classe in una categoria
- 16. In SQL Server, quando è necessario utilizzare GO e quando si utilizza il punto e virgola;?
- 17. Utilizzo del metodo equals() con String e Object in Java
- 18. Perché in overload è necessario l'overloading e l'override del metodo?
- 19. uso del metodo equals() nell'interfaccia comparatore? Il metodo
- 20. Java - compareTo e gli operatori
- 21. L'override del metodo hashCode() di Java non è necessario se non si utilizza hashmap o hashset
- 22. "__rvm_do_with_env_before" e "__rvm_after_cd" quando si esegue "cd"
- 23. Perché è necessario eseguire l'override di hashcode e equivale al metodo della chiave per Hashmap?
- 24. Rubino - a capo e gli operatori
- 25. Gli operatori resque non si avviano correttamente
- 26. Metodo Overriding Equals in Structures
- 27. app.config "forced" (?) On .net 4.0 .. è necessario?
- 28. E 'necessario chiudere il flusso del metodo di WebInvoke
- 29. Quando dovrebbe essere una classe .NET Override()? Quando non dovrebbe?
- 30. Quando è necessario NSCopying?
+1 Molto chiaro e conciso. –