¿Cómo se utilizan cadenas literales con interpolación?

133

En C # 6 hay una nueva característica: cadenas interpoladas.

Estos le permiten poner expresiones directamente en el código, en lugar de depender de índices:

string s = string.Format("Adding \"{0}\" and {1} to foobar.", x, this.Y());

Se convierte en:

string s = $"Adding \"{x}\" and {this.Y()} to foobar.";

Sin embargo, tenemos muchas cadenas a través de varias líneas usando cadenas literales (principalmente sentencias SQL) como esta:

string s = string.Format(@"Result...
Adding ""{0}"" and {1} to foobar:
{2}", x, this.Y(), x.GetLog());

Revertir estos a cadenas regulares parece desordenado:

string s = "Result...\r\n" +
$"Adding \"{x}\" and {this.Y()} to foobar:\r\n" +
x.GetLog().ToString();

¿Cómo uso las cadenas textuales e interpoladas juntas?

Keith
fuente
3
Si realmente se trata de cadenas SQL, ¿hay alguna razón por la que no esté utilizando consultas parametrizadas?
svick
1
"tenemos muchas cadenas a través de varias líneas que usan cadenas literales (principalmente sentencias SQL)" parece que tiene muchas cadenas SQL que permiten ataques de inyección SQL.
Cetin Basoz
1
@svick estamos, todo lo que ingresa el usuario está parametrizado. Sin embargo, todavía utilizamos mucho SQL dinámico, ya que creamos dinámicamente SQL para nuestras entidades en código.
Keith
1
@CetinBasoz no lo hacemos: toda la entrada del usuario está parametrizada. Hay muchas circunstancias en las que tiene SQL dinámico, por ejemplo, LINQ o cualquier otro marco de mapeo de objetos.
Keith

Respuestas:

194

Puede aplicar ambos $y @prefijos a la misma cadena:

string s = $@"Result...
Adding ""{x}"" and {this.Y()} to foobar:
{x.GetLog()}";

Desde que se introdujo en C # 6 , las cadenas textuales interpoladas tuvieron que comenzar con los tokens $@, pero a partir de C # 8, puede usar $@o@$ .

Keith
fuente
57
Opuesto ( @$"...") no funciona, lo que me trae aquí.
Sinatr
12
@Sinatr, sí, tiene que estar $@"..."en ese orden.
Keith
36
El hecho de que $@funciona cuando @$no funciona, tiene mucho sentido cuando lo piensas. Cuando me confundo acerca de esto, lo que sucedió con frecuencia cuando comencé a usar esta sintaxis, siempre me decía: "Interpolar esta cadena literal" porque lo contrario no tendría sentido.
Heki
1
@RayLuo no realmente, pero dada la rapidez con que se han convertido varios serializadores .NET JSON, probablemente no debería codificar JSON directamente de todos modos.
Keith
1
Si aplica el dúo a un existente const string, suelte el const.
bvj