2012-02-02 11 views
7

Perché in questa situazione il metodo di oggetto ReferenceEquals si comporta in modo diverso?RiferimentoEquals funziona male con le stringhe

string a= "fg"; 
string b= "fg"; 
Console.WriteLine(object.ReferenceEquals(a, b)); 

Quindi, in questa situazione è ottenere un risultato true. Nel caso, confronta i valori delle mie stringhe e non i riferimenti. Ma quando scrivo qualcosa come:

StringBuilder c = new StringBuilder("fg"); 
string d = c.ToString(); 
Console.WriteLine(object.ReferenceEquals(a, d)); 

In questo caso funziona bene e il risultato è false, perché mette a confronto i riferimenti dei miei oggetti.

+1

Anche Chuck Norris è su SO. Wow! – RBT

risposta

13

Il primo esempio ha una costante di tempo di compilazione "fg" a cui fanno riferimento due variabili. Poiché si tratta di una costante temporale di compilazione, le due variabili fanno riferimento a un oggetto. I riferimenti sono uguali.

Leggere l'argomento di interno stringa per ulteriori informazioni su questo comportamento. Ad esempio, prendere in considerazione:

Ad esempio, se si assegna la stessa stringa letterale a più variabili, il runtime recupera lo stesso riferimento alla stringa letterale dal pool interno e lo assegna a ciascuna variabile.

http://msdn.microsoft.com/en-us/library/system.string.intern.aspx

Nel secondo esempio, solo uno è un tempo di compilazione costante, l'altro è un risultato di alcune operazioni. a e d non fanno riferimento allo stesso oggetto, quindi si ottiene il risultato errato da ReferenceEquals.

+0

@Henk, non sono sicuro di dove stai andando con la piegatura, anche se ammetto che non sono del tutto familiare con il concetto. La mia lettura è semplicemente che il folding è un'espressione letterale di, diciamo, "f" + "g" 'sarà convertito in' "fg" 'dal compilatore. Tuttavia, nel codice 'string a =" fg "; stringa b = "fg"; ', ci si aspetta di vedere nell'emissione IL' IL_0000: ldstr "fg"/IL_0005: stloc.0/IL_0006: ldstr "fg"/IL_000B: stloc.1' –

+0

E infatti, se si hanno anche 'string c =" f "+" g "', la stessa istruzione viene emessa per caricare "fg". Per la mia istruzione, dov'è il pieghevole per aeb? –

2

Si comporta correttamente in entrambi i casi.

La ragione a e b sono lo stesso oggetto stringa è perché il compilatore ha notato specificata la stessa stringa due volte, e ha riutilizzato lo stesso oggetto stringa per inizializzare sia a e b.

Ciò si verifica generalmente con ogni costante di stringa nell'applicazione.

0

Secondo questa post ha a che fare con qualcosa chiamato internato. aeb sono nel tuo caso due variabili che puntano alla stessa istanza, ecco perché ReferenceEquals restituisce true.

Problemi correlati