Як ви використовуєте дослівні рядки з інтерполяцією?


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 або будь-яка інша рамка відображення об'єктів.
Кіт

Відповіді:


194

Ви можете застосувати обидва $і @префікси до одного рядка:

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

З тих пір як введена в C # 6 , интерполированное стенографічних рядків довелося починати з токенов $@, але , починаючи з C # 8, то ви можете використовувати $@або@$ .


57
Навпроти ( @$"...") не працює, що приводить мене сюди.
Синатр

12
@Sinatr Так, це має бути $@"..."в такому порядку.
Кіт

36
Те, що $@працює, коли @$цього немає, має ідеальний сенс, коли ти думаєш про це. Коли я плутаюсь з цього приводу, що часто траплялося, коли я почав використовувати цей синтаксис, я завжди казав собі: "Інтерполювати цей дослівний рядок", бо навпаки не має сенсу.
Хекі

1
@RayLuo не дуже, але враховуючи те, як швидко стали різні .NET JSON серіалізатори, ви, мабуть, не повинні безпосередньо кодувати JSON у будь-якому випадку.
Кіт

1
Якщо ви застосовуєте дует до існуючого const string, киньте const.
bvj
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.