Como você usa seqüências textuais com interpolação?

133

No C # 6, há um novo recurso: seqüências de caracteres interpoladas.

Isso permite que você coloque expressões diretamente no código, em vez de confiar em índices:

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

Torna-se:

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

No entanto, temos muitas seqüências de caracteres em várias linhas usando seqüências textuais (principalmente instruções SQL) como esta:

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

A reversão para cadeias regulares parece confusa:

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

Como uso as seqüências verbatim e interpoladas juntas?

Keith
fonte
3
Se é realmente sobre seqüências de caracteres SQL, existe algum motivo para você não estar usando consultas parametrizadas?
svick
1
"temos muitas cadeias de caracteres em várias linhas usando cadeias textuais (principalmente instruções SQL)" parece que você tem várias cadeias de SQL que permitem ataques de injeção de SQL.
Cetin Basoz
1
@ Rick somos, tudo o que a entrada do usuário é parametrizada. No entanto, ainda usamos muito o SQL dinâmico, pois criamos SQL dinamicamente para nossas entidades no código.
Keith
1
@CetinBasoz nós não - toda a entrada do usuário é parametrizada. Existem várias circunstâncias em que você possui SQL dinâmico - por exemplo, LINQ ou qualquer outra estrutura de mapeamento de objetos.
Keith

Respostas:

194

Você pode aplicar ambos $e @prefixos à mesma sequência:

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

Desde que foram introduzidas no C # 6 , as seqüências verbais interpoladas tiveram que começar com os tokens $@, mas começando com o C # 8, você pode usar um $@ou outro@$ .

Keith
fonte
57
Oposto ( @$"...") não funciona, o que me traz aqui.
Sinatr 31/07
12
@ Sinatr sim, tem que estar $@"..."nessa ordem.
Keith
36
O fato de $@funcionar quando @$não funciona , faz todo o sentido quando você pensa sobre isso. Quando fico confuso sobre isso, o que aconteceu com frequência quando comecei a usar essa sintaxe, sempre dizia para mim mesmo: "Interpole essa sequência literal" porque o contrário não faria sentido.
Heki
1
@RayLuo não é verdade, mas, considerando a rapidez com que vários serializadores .NET JSON se tornaram, você provavelmente não deveria codificar diretamente JSON de qualquer maneira.
Keith
1
Se aplicar a dupla a um existente const string , solte o const.
BVJ