Come si usano le stringhe testuali con interpolazione?


133

In C # 6 c'è una nuova funzionalità: stringhe interpolate.

Questi ti consentono di inserire le espressioni direttamente nel codice, anziché fare affidamento sugli indici:

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

diventa:

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

Tuttavia, abbiamo molte stringhe su più righe usando stringhe testuali (principalmente istruzioni SQL) come questa:

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

Il ripristino di queste stringhe regolari sembra disordinato:

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

Come posso usare insieme stringhe sia testuali che interpolate?


3
Se si tratta davvero di stringhe SQL, c'è qualche motivo per non utilizzare invece query parametrizzate?
svick,

1
"Abbiamo molte stringhe su più righe usando stringhe testuali (principalmente istruzioni SQL)" sembra che tu abbia molte stringhe SQL che abilitano gli attacchi SQL injection.
Cetin Basoz,

1
@svick siamo, tutto l'input dell'utente è parametrizzato. Tuttavia, utilizziamo ancora in modo dinamico SQL dinamico, poiché creiamo in modo dinamico SQL per le nostre entità nel codice.
Keith,

1
@CetinBasoz no - tutti gli input dell'utente sono parametrizzati. Esistono molte circostanze in cui si dispone di SQL dinamico, ad esempio LINQ o qualsiasi altro framework di mapping degli oggetti.
Keith,

Risposte:


195

È possibile applicare sia $e @prefissi per la stessa stringa:

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

Da quando sono stati introdotti in C # 6 , le stringhe testuali interpolate hanno dovuto iniziare con i token $@, ma a partire da C # 8, è possibile utilizzare $@o@$ .


57
Opposite ( @$"...") non funziona, il che mi porta qui.
Sinatr,

12
@Sinatr sì, deve essere $@"..."in questo ordine.
Keith,

36
Il fatto che funzioni $@quando @$no, ha perfettamente senso quando ci pensi. Quando mi confondo su questo, che è accaduto spesso quando ho iniziato a usare questa sintassi, mi sono sempre detto: "Interpolare questa stringa testuale" perché non avrebbe senso il contrario.
Heki,

1
@RayLuo non proprio, ma data la velocità con cui sono diventati vari serializzatori .NET JSON probabilmente non dovresti comunque codificare direttamente JSON.
Keith,

1
Se si applica il duo a un esistente const string, rilasciare const.
bvj,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.