2008-11-13 24 views

Respuesta

44

Sí. Esto está garantizado por la especificación C#. Es en la sección 7.18 (de la especificación C# 3.0):

Siempre que una expresión cumple los requisitos enumerados anteriormente, la expresión se evalúa en tiempo de compilación. Esto es cierto incluso si la expresión es una sub-expresión de una expresión más grande que contiene construcciones no constantes.

(Los "requisitos enumerados anteriormente" incluyen el operador + aplica a dos expresiones constantes.)

Consulte también this question.

+0

Lo mismo con VB.NET, supongo, ¿no? – Larsenal

+0

No estoy seguro - es un problema de lenguaje, no de framework. –

+0

¿Te importa si cambio la pregunta a C#? – Larsenal

2

Creo que la respuesta es sí, pero que tendría que mirar lo que el compilador escupe ... sólo compila, y el uso de reflector en él :-)

7

Sí.

C# no solo optimiza la concatenación de literales de cadena, sino que también contrae literales de cadena equivalentes en constantes y utiliza punteros para hacer referencia a todas las referencias a la misma constante.

+0

¿Tiene una referencia para esta información? –

+1

Se denomina "Interrogación de cadena", y está cubierto en profundidad en el libro CLR a través de C#. – FlySwat

4

De la boca de los caballos:

La concatenación es el proceso de añadir una cadena al final de otra cadena. Cuando concatena literales de cadena o constantes de cadena utilizando el operador +, el compilador crea una sola cadena. No se produce la concatenación de tiempo de ejecución. Sin embargo, las variables de cadena se pueden concatenar solo en tiempo de ejecución. En este caso, debe comprender las implicaciones de rendimiento de los diversos enfoques.

http://msdn.microsoft.com/en-us/library/ms228504.aspx

20

Sólo una nota sobre un tema relacionado - el compilador de C# también 'optimizar' múltiples concatenaciones que implican los no literales utilizando el '+' operador para una sola llamada a una sobrecarga de múltiples parámetros del método String.Concat().

Así

string result = x + y + z; 

compila a algo equivalente a

string result = String.Concat(x, y, z); 

más que la posibilidad más ingenua:

string result = String.Concat(String.Concat(x, y), z); 

Nada trascendental, pero sólo quería añadir este bit a la discusión sobre optimización de concatenación literal de cadenas. No sé si este comportamiento es obligatorio según el estándar del idioma o no.

2

Tenía una pregunta similar, pero sobre VB.NET en lugar de C#. La forma más sencilla de verificar esto fue ver el ensamblado compilado en Reflector.

La respuesta fue que tanto el compilador C# como el compilador VB.NET optimizan la concatenación de cadenas literales.

5

Sí - Puede ver esto explícitamente usando ILDASM.

Ejemplo:

Aquí es un programa que es similar a su ejemplo seguido por el código compilado CIL:

Nota: Estoy usando la función String.Concat() sólo para ver cómo el compilador trata el dos métodos diferentes de concatenación.

Programa

class Program 
{ 
    static void Main(string[] args) 
    { 
     string s = "test " + "this " + "function"; 
     string ss = String.Concat("test", "this", "function"); 
    } 
} 

ILDASM

.method private hidebysig static void Main(string[] args) cil managed 
{ 
    .entrypoint 
    // Code size  29 (0x1d) 
    .maxstack 3 
    .locals init (string V_0, 
      string V_1) 
    IL_0000: nop 
    IL_0001: ldstr  "test this function" 
    IL_0006: stloc.0 
    IL_0007: ldstr  "test" 
    IL_000c: ldstr  "this" 
    IL_0011: ldstr  "function" 
    IL_0016: call  string [mscorlib]System.String::Concat(string, 
                   string, 
                   string) 
    IL_001b: stloc.1 
    IL_001c: ret 
} // end of method Program::Main 

Note como en IL_0001 el compilador crea la constante "prueba de esta función", en contraposición a la forma en que el compilador trata el String.Concat () función - que crea una constante para cada uno de los parametros .Concat(), luego llama a la función .Concat().

Cuestiones relacionadas