2015-05-23 12 views
7

Questa domanda non riguarda le differenze tra == e Equals. Si tratta di perché sono stati progettati diversi.Perché Equals() e == sono stati progettati per essere diversi?

Sappiamo che le differenze causa molti problemi, che deve essere stato abbastanza facile da individuare in anticipo:

  • Equals e == producono risultati diversi per due istanze della stessa entità.
  • == rendimento risultati diversi quando si confrontano sottoclassi, perché == non è polimorfica
+0

Steve, che ne dici di leggere la prima riga della mia domanda prima di saltare alle conclusioni? NON riguarda la differenza, ma perché è stato progettato in modo diverso. Una domanda completamente diversa. –

+4

@Claies Penso che sia sufficientemente non ovvio. –

+1

Claies, certamente non lo so, perché tutte le mie ricerche puntano a diverse spiegazioni delle differenze. Nessuno di loro per i diversi scopi. Perché non spiega i diversi scopi o pubblica un link? –

risposta

3

La risposta breve è che il linguaggio C# team di progettazione e il team di progettazione framework .NET non essere d'accordo sul modo migliore per confrontare i valori/oggetti per l'uguaglianza, quindi ognuno ha implementato il proprio sistema.

Per una risposta più tecnica e dettagliata, fare riferimento a a blog post on the subject by Eric Lippert.

+2

Ciò potrebbe essere dimostrato dal fatto che non esiste alcun supporto nel linguaggio IL per gli operatori. Sono "compilati" dal compilatore C# (e da altre lingue "compatibili") usando i metodi (con alcuni nomi e con il nome speciale) flag ... https://msdn.microsoft.com/en-us/library/aa735713 (v = vs.71) .aspx *** L'overloading dell'operatore non è nel CLS **. Tuttavia, il CLS fornisce linee guida sulla fornitura di nomi utili (come Add()) e l'impostazione di un bit nei metadati. I compilatori che scelgono di supportare il sovraccarico dell'operatore dovrebbero seguire queste linee guida ma non sono obbligati a farlo.* – xanatos

+0

Come Eric Lippert, un ex disegnatore di linguaggi per C#, concorda sul fatto che i progettisti del framework hanno probabilmente preso la decisione quadro corretta, la parafrasi semplificata per semplificare diventa * grossolanamente inaccurata *. La tua risposta diventa quindi peggiore di una risposta solo come link, in quanto presenta in modo errato il lik a cui punta. –

+1

@PieterGeerkens, ci sono due (in realtà tre, ma fissiamo a due) modi di fare l'uguaglianza in C# /. NET. Quindi, se si esclude che due gruppi non potrebbero essere d'accordo e quindi abbiano implementato due sistemi diversi, ci viene lasciata l'idea che un singolo gruppo di consenso pensasse che sarebbe una buona idea creare due sistemi di uguaglianza incompatibili. In qualche modo, penso che la mia sintesi, lungi dall'essere "grossolanamente inaccurata" sia una dichiarazione di fatto estremamente accurata, perché l'alternativa è molto preoccupante. –

Problemi correlati