2010-10-06 20 views
14

Qual è la differenza tra la valutazione di == e Uguale in C#?== rispetto è uguale a C#

Per Ex,

if(x==x++)//Always returns true 

ma

if(x.Equals(x++))//Always returns false 

Modificato:

 int x=0; 
    int y=0; 

    if(x.Equals(y++))// Returns True 
+12

@ Moderatori: leggere la domanda completa prima di chiudere qualsiasi domanda. Se hai i diritti per chiudere qualsiasi domanda, usali nel posto giusto. –

+4

@ Jørn Schou-Rode, Arcturus, Oded, Pandiya Chendur, GregS: Dato che tutti voi avete votato per chiudere questa domanda. Per favore forniscimi una risposta adeguata per la domanda posta sopra o riapri la domanda. –

risposta

12

Secondo le specifiche, questo è il comportamento previsto.

Il comportamento del primo è governato dalla sezione 7.3 della specifica:

Operandi in un'espressione vengono valutate da sinistra a destra. Ad esempio, in F(i) + G(i++) * H(i), il metodo F viene chiamato utilizzando il vecchio valore di i, quindi il metodo G viene chiamato con il vecchio valore di i e, infine, il metodo H viene chiamato con il nuovo valore di i. Questo è separato e non correlato alla precedenza degli operatori.

Così nel x==x++, prima l'operando sinistro è valutato (0), poi il destro viene valutato (0, x diventa 1), quindi il confronto è fatto: 0 == 0 è vero.

Il comportamento del secondo è governato dalla sezione 7.5.5:

  • Se M è un membro funzione dell'istanza dichiarata in un valore di tipo:
    • E viene valutata. Se questa valutazione causa un'eccezione, non vengono eseguiti ulteriori passaggi.
    • Se E non è classificato come variabile, viene creata una variabile locale temporanea di tipo E e il valore di E viene assegnato a tale variabile. E viene quindi riclassificato come riferimento a quella variabile locale temporanea. La variabile temporanea è accessibile come questa all'interno di M, ma non in altro modo. Quindi, solo quando E è una variabile vera è possibile che il chiamante osservi le modifiche che M fa a questo.
    • L'elenco degli argomenti viene valutato come descritto in §7.5.1.
    • M viene invocato. La variabile a cui fa riferimento E diventa la variabile a cui fa riferimento.

Nota che tipi di valore sono passati per riferimento ai loro metodi.

Così in x.Equals(x++), prima il bersaglio viene valutata (E è x, una variabile), allora gli argomenti vengono valutati (0, x diventa 1), quindi il confronto è fatto: x.Equals(0) è falso.

MODIFICA: volevo anche dare credito al commento ora ritirato di dtb, pubblicato mentre la domanda era chiusa. Penso che stesse dicendo la stessa cosa, ma con la limitazione della lunghezza dei commenti non era in grado di esprimerlo pienamente.

4

Ordine di valutazione. ++ valuta prima (secondo esempio). Ma nel primo esempio, == viene eseguito per primo.

+1

non sono d'accordo, provalo, guarda la parte modificata –

+2

Wow! Non posso credere ai miei occhi ... tornerò da te – Aliostad

+2

Sure Anytime .... ma l'output rimarrà lo stesso, anche se verrai dopo un anno ... :) –