2013-05-20 29 views
7

Io uso questo codice e ottenere risultato vero:Come confrontare due oggetti con valori stringa?

object text1 = "test"; 
object text2 = "test"; 
Console.WriteLine("text1 == text2 : " + (text1 == text2)); 
//return:true 

Ma quando provo a più bassa: object text2 = "test".ToLower(); ottengo false risultato?

object text1 = "test".ToLower(); 
    object text2 = "test".ToLower(); 
    Console.WriteLine("text1 == text2 : " + (text1 == text2)); 
  //return:false 

risposta

14

Nel primo caso, si sta confrontando due stringhe utilizzando l'uguaglianza di riferimento, ma le due stringhe sono interned strings.

Nel secondo caso, quando si chiama ToLower() sulla stringa, si crea una nuova stringa, quindi si confrontano due nuove istanze di stringa, che non sono la stessa istanza se confrontate utilizzando l'uguaglianza di riferimento.

Se si fa il confronto con il metodo String.Equals, e non si utilizza Object.Equals, troverete che restituisca vero, dal momento che String.Equals metterà a confronto in base al largo il valore contenuto all'interno della stringa, non i riferimenti agli oggetti reali.

+0

In realtà, l'operatore di uguaglianza mira al ** valore **, non al riferimento: http://msdn.microsoft.com/en-us/library/system.string.op_equality.aspx –

+0

Ok, ora I ' ho visto il tuo aggiornamento. Object '==' mira al riferimento. –

+1

@AndreCalil 'String.Equality' fa, ma' Object.Equals' usa l'uguaglianza di riferimento, che è quello che ho detto. –

3

Presumo che ciò avvenga perché si sta verificando l'uguaglianza degli oggetti, non l'uguaglianza delle stringhe.

Vale a dire nel primo esempio il compilatore ha effettuato la memorizzazione di testo1 e testo2 lo stesso oggetto reale poiché i contenuti sono gli stessi. Nel secondo esempio, i nuovi oggetti vengono restituiti dalla chiamata ToLower() e quindi non sono più lo stesso oggetto.

Se si modifica il tipo di archiviazione dichiarato da oggetto a stringa, si dovrebbe visualizzare il comportamento desiderato.

Problemi correlati