una interpoladas interpolacion extraer entender ejemplos caracteres cadenas cadena c# c#-6.0

interpoladas - string c# ejemplos



¿La interpolación de cadenas evalúa el uso duplicado? (4)

¿Es el compilador lo suficientemente inteligente como para saber que estos son del mismo valor [...]?

Pero no será necesariamente el mismo valor. El método podría muy bien devolver resultados diferentes en invocaciones posteriores, por lo que no puede almacenar el resultado en caché.

Si tengo una cadena de formato que utiliza el mismo titular de lugar varias veces, como:

emailBody = $"Good morning {person.GetFullName()}, blah blah blah, {person.GetFullName()} would you like to play a game?";

¿se person.GetFullName() dos veces, o es el compilador lo suficientemente inteligente como para saber que tienen el mismo valor y deberían evaluarse una vez?


La mayoría de las veces, el compilador podrá optimizar esto. Desafortunadamente, los tiempos en los que no puede ser también son los momentos en los que te importaría más.

La optimización en este contexto no se basa en llamar a la misma función dos veces, sino en la alineación. Los accesores generalmente son triviales (buscar un campo, o como mucho hacer una conversión entre tipos numéricos o formato / análisis entre tipos numéricos y de cadena) y, como tales, cumplir fácilmente los criterios para la inclusión. Además, el JIT evita problemas con la incorporación de módulos cruzados. Por otro lado, las interfaces, los delegados y las llamadas virtuales pueden evitar la inclusión.

Una vez que el compilador ha reemplazado ambas llamadas por el cuerpo de la función, ve dos cargas del mismo campo, y es probable que pueda usar la optimización de subexpresión común para obtener el campo solo una vez (siempre que pueda probar que no hay escritura intermedia desde el mismo). hilo ... en particular, no tiene que preocuparse por las escrituras de otros hilos a menos que haya un bloqueo intermedio).

Pero esto solo guarda una captura de campo extra. En los casos en que la llamada de acceso sea costosa (llamada a procedimiento remoto o búsqueda en la base de datos), no será posible realizar la inscripción y usted pagará dos evaluaciones. En tal caso, vale la pena almacenar en caché el resultado.


No hay una manera de que el compilador esté seguro de que un método siempre devolverá el mismo valor. Si necesita tal optimización, tiene dos opciones:

Usa una variable:

string fullName = person.GetFullName(); emailBody = $"Good morning {fullName}, blah blah blah, {fullName} would you like to play a game?";

Utilizando String.Format :

emailBody = String.Format("Good morning {0}, blah blah blah, " + "{0} would you like to play a game?", person.GetFullName();


Sí, será evaluado dos veces. No se puede saber que es el mismo valor. Por ejemplo:

Random rng = new Random(); Console.WriteLine($"{rng.Next(5)}, {rng.Next(5)}, {rng.Next(5)}");

Es exactamente igual que si acabas de usar la expresión como un argumento de método, si llamaste:

Console.WriteLine("{0} {1}", person.GetFullName(), person.GetFullName());

... esperarías que GetFullName a GetFullName dos veces, ¿no?

Si solo quieres evaluarlo una vez, hazlo de antemano:

var name = person.GetFullName(); emailBody = $"Good morning {name}, blah blah blah, {name} would you like to play a game?";

O simplemente use una string.Format normal. string.Format llamada:

emailBody = string.Format( "Good morning {0}, blah blah blah, {0} would you like to play a game?", person.GetFullName());