Как использовать дословные строки с интерполяцией?

133

В C # 6 появилась новая функция: интерполированные строки.

Они позволяют вставлять выражения прямо в код, а не полагаться на индексы:

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

становится:

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

Однако у нас есть много строк в нескольких строках, использующих дословные строки (в основном операторы SQL), например:

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

Возврат их к обычным строкам кажется беспорядочным:

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

Как использовать вместе дословные и интерполированные строки?

Кит
источник
3
Если это действительно о строках SQL, есть ли причина, по которой вы вместо этого не используете параметризованные запросы?
svick
1
«У нас есть много строк в нескольких строках, использующих дословные строки (в основном операторы SQL)» звучит так, как будто у вас есть много строк SQL, допускающих атаки SQL-инъекций.
Cetin Basoz
1
@svick мы, все вводимые пользователем параметры параметризованы. Тем не менее, мы по-прежнему активно используем динамический SQL, поскольку мы динамически создаем SQL для наших объектов в коде.
Кейт
1
@CetinBasoz мы не делаем - весь пользовательский ввод параметризован. Есть много обстоятельств, когда у вас есть динамический SQL - например, LINQ или любая другая структура сопоставления объектов.
Кит

Ответы:

195

Вы можете применить оба $ и @префиксы к одной и той же строки:

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

С тех пор как введена в C # 6 , интерполированное стенографических строк пришлось начинать с токенов $@, но , начиная с C # 8, то вы можете использовать $@или@$ .

Кит
источник
57
Противоположный ( @$"...") не работает, что приводит меня сюда.
Sinatr
12
@Sinatr да, это должно быть $@"..."в таком порядке.
Кейт
36
Тот факт, что $@работает, когда @$нет, имеет смысл, если подумать. Когда я запутался в этом, что часто случалось, когда я начинал использовать этот синтаксис, я всегда говорил себе: «Интерполировать эту дословную строку», потому что обратное не имело бы смысла.
Heki
1
@RayLuo не совсем, но, учитывая, насколько быстрыми стали различные сериализаторы .NET JSON, вам, вероятно, в любом случае не следует напрямую кодировать JSON.
Кейт
1
Если вы применяете дуэт к существующему const string, оставьте const.
bvj 05