2010-11-26 17 views
13

¿El compilador de C# o CLR .NET hace alguna optimización inteligente de memoria de literales/constantes de cadena? Podría jurar que había oído hablar del concepto de "internalización de cadenas", de modo que en dos bits de código en un programa, el literal "esto es una cadena" en realidad se referiría al mismo objeto (presumiblemente seguro, con cuerdas ¿inmutable?). No puedo encontrar ninguna referencia útil en Google aunque ...C# ¿los literales de cadena son optimizados por el compilador?

¿He oído esto mal? No se preocupe: no estoy haciendo nada horrible en mi código con esta información, solo quiero mejorar mi comprensión de cómo funciona bajo las sábanas.

+0

Relacionados http://stackoverflow.com/q/372547/38206 –

Respuesta

17

EDIT: Aunque sospecho firmemente la declaración a continuación es cierto para todas las implementaciones compilador de C#, I' No estoy seguro de que esté realmente garantizado en la especificación. La sección 2.4.4.5 de la especificación habla de literales haciendo referencia a la misma instancia de cadena, pero no menciona otras expresiones de cadena constante. I sospechoso esto es un descuido en la especificación - Le enviaré un correo electrónico a Mads y Eric al respecto.


No son solo literales de cadena. Es cualquier cadena constante.Así, por ejemplo, tenga en cuenta:

public const string X = "X"; 
public const string Y = "Y"; 
public const string XY = "XY"; 

void Foo() 
{ 
    string z = X + Y; 
} 

El compilador da cuenta de que la concatenación aquí (por z) se encuentra entre dos cadenas constantes, por lo que el resultado es también una constante de cadena. Por lo tanto, el valor inicial de z será la misma referencia que el valor de XY, ya que son constantes de tiempo de compilación con el mismo valor.

EDIT: La respuesta de Mads y Eric sugirió que en Microsoft C# constantes de cadena compilador y literales de cadena se trata generalmente de la misma manera - pero que otras implementaciones pueden ser diferentes.

+0

¿Dos constantes de cadena idénticas en diferentes conjuntos apuntan al mismo objeto también?/¿El jitter intern cadenas literales? – CodesInChaos

+0

@CodeInChaos: Creo que eso depende del atributo 'CompilationRelaxationsAttribute (CompilationRelaxations.NoStringInterning)'. Sin embargo, no me gustaría decirlo con seguridad. –

+0

Hola @JonSkeet, por favor, indique si las cadenas internas con el mismo contenido siempre tienen la misma referencia. ¿Significa que la comparación de referencias de tales cadenas será verdadera? –

6

This article explica la intercesión de cadena bastante bien. Cita:

.NET tiene el concepto de un "interno grupo". Básicamente es solo un conjunto de cadenas , pero se asegura de que cada vez que haga referencia a la misma cadena literal, obtenga una referencia a la misma cadena . Probablemente sea dependiente del idioma, pero ciertamente es verdadero en C# y VB.NET, y estaría muy sorprendido de ver un lenguaje , ya que IL lo hace muy fácil de do (probablemente sea más fácil que fallar a literales internos). Así como literales de ser internado automáticamente, puede internar cadenas manualmente con el método Intern , y comprobar si es o no ya hay una cadena de internados con el mismo carácter secuencia en la piscina usando el método IsInterned . De alguna manera, este devuelve una cadena en lugar de un que un booleano - si una cadena igual es en el grupo, se devuelve una referencia a esa cadena . De lo contrario, null es devuelto. Del mismo modo, el método Intern devuelve una referencia a un cadena internados - ya sea la cadena que pasaron en si ya estaba en la piscina, o una cadena internados de nueva creación, o un igual cadena que ya estaba en la piscina .

+1

Nota: Dado que las cadenas internas no se liberan durante el tiempo de vida del dominio de la aplicación, el uso incorrecto de la interinidad puede causar una pérdida de memoria. – CodesInChaos

7

Sí, sí optimiza los literales de cadena. Un ejemplo sencillo donde se puede ver que:

string s1="A"; 
string s2="A"; 
object.ReferenceEquals(s1,s2); //true 
Cuestiones relacionadas