2012-02-02 14 views
7

¿Por qué en esta situación ReferenceEquals método de objetos se comporta de manera diferente?ReferenciaEquals funciona mal con cadenas

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

Así que en esta situación es obtener un resultado true. En el caso, compara valores de mis cadenas y no referencias. Pero cuando escribo algo como:

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

En este caso se trabaja muy bien y el resultado es false, porque compara las referencias de mis objetos.

+1

Incluso Chuck Norris está en SO. ¡Guauu! – RBT

Respuesta

13

El primer ejemplo tiene una constante de tiempo de compilación "fg" a la que hacen referencia dos variables. Como esta es una constante de tiempo de compilación, las dos variables hacen referencia al único objeto. Las referencias son iguales.

Lea en el tema de cadena de internados para obtener más información sobre este comportamiento. Como iniciador, considere:

Por ejemplo, si asigna la misma cadena literal a varias variables, el tiempo de ejecución recupera la misma referencia a la cadena literal del grupo interno y la asigna a cada variable.

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

En el segundo ejemplo, sólo uno es una constante de tiempo de compilación, el otro es un resultado de algunas operaciones. a y d no hacen referencia al mismo objeto, por lo que obtiene el resultado falso de ReferenceEquals.

+0

@Henk, no estoy seguro de dónde vas a doblar, aunque admito que no estoy completamente familiarizado con el concepto. Mi lectura es simplemente que doblar es una expresión literal de, digamos, '" f "+" g "' se convertirá en '" fg "' por el compilador. Sin embargo, en el código 'string a =" fg "; string b = "fg"; ', espera ver en el IL emitido' IL_0000: ldstr "fg"/IL_0005: stloc.0/IL_0006: ldstr "fg"/IL_000B: stloc.1' –

+0

Y de hecho, si también tiene 'string c =" f "+" g "', la misma instrucción se emite para cargar "fg". Para mi propia educación, ¿dónde está el plegado de a y b? –

2

Se comporta correctamente en ambos casos.

La razón a y b son el mismo objeto de cadena se debe a que el compilador ha dado cuenta de que ha especificado la misma cadena dos veces, y se ha reutilizado el mismo objeto de cadena para inicializar tanto a y b.

Esto generalmente ocurrirá con cada cadena constante en su aplicación.

0

De acuerdo con esta post que tiene que ver con algo que se llama la internación. ay b son en su caso dos variables que apuntan a la misma instancia, es por eso que ReferenceEquals regresa verdadero.

Cuestiones relacionadas