Інтерполяція довгих рядків у C # 6


134

Я виявив, що хоча інтерполяція рядків дуже приємна, коли застосовується до моєї існуючої базової кодової рядки Формати викликів, зважаючи на загальний бажаний ліміт стовпців, рядок швидко стає занадто довгим для одного рядка. Особливо, коли інтерпольовані вирази є складними. За допомогою рядка формату у вас є список змінних, які ви можете розділити на кілька рядків.

var str = string.Format("some text {0} more text {1}",
    obj1.property,
    obj2.property);

Хтось має переважні засоби розриву цих ліній?

Я думаю, ви могли б зробити щось на кшталт:

var str = $"some text { obj1.property }" +
  " more text { obj2.property };

1
На мій досвід, краще уникати інтерполяції складних виразів. Швидше витягніть змінну в цьому випадку. Якщо ви це зробите, і ви розбиваєтесь там, де у ваших рядках є нові рядки, зазвичай це буде добре.
markijbema

2
Мене бентежить це питання. Я просто хочу багаторядковий, $""який працює так@""
полковник Паніка

2
Полковнику Паніку, задається питання про те, як розбити довгі лінії інтерполяції, щоб ми не порушували вимоги щодо ширини стовпців, не вводячи канали ліній у самому літеральному рядку. $ @ "" чудово, але будь-які нові рядки, що вводяться в них, будуть в рядковій літералі.
Ієремія Гоуді

4
Небезпека: $"some text { obj1.property }" + " more text { obj2.property }";не робить те, що, здається, вважає, що це робить. Тільки перша половина цього виразу є інтерпольованим рядком; він потім об'єднується з , НЕ -interpolated рядок буквального" more text { obj2.property }"
Bacar

1
Для підтримки \ т \ г \ п в $ @ бачити питання stackoverflow.com/questions/51991713 / ...
M.Hassan

Відповіді:


198

Ви можете розбити рядок на кілька рядків, але я б не сказав, що синтаксис вже виглядає приємно.

Вам потрібно використовувати $@синтаксис, щоб використовувати інтерпольований дослівний рядок, і ви можете розміщувати нові рядки всередині {...}параметрів, як це:

string s = $@"This is all {
    10
    } going to be one long {
    DateTime.Now
    } line.";

Рядок вище не містить нових рядків і насправді матиме такий вміст:

Це все 10 буде один довгий рядок 01.08.2015 23.49.47.

(примітка, норвезький формат)

Тепер, сказавши це, я не переставав би користуватися string.Format. На мою думку, деякі з цих рядкових інтерполяційних виразів виглядають дійсно добре, але складніші починають дуже важко читати. Враховуючи, що, якщо ви не використовуєте FormattableString, код буде скомпільований у виклик на String.Formatбудь-який, я б сказав, продовжуйте рухатись String.Formatтам, де це має сенс.


Суцільна відповідь. Я майже впевнений, що FormattableStringзводиться до дзвінка String.Formatтеж.
Алекс Букер

8
Ця відповідь допомогла мені зрозуміти, як зробити протилежне до цього. Дякую за $@""синтаксис!
Бобсон

@AlexBooker Це складніше, ніж це. Ви не можете цього зробити, FormattableString.Invarian($"Hello {name}" + \n "are you the owner of {pet}?");оскільки він об'єднує дві інтерпольовані рядки в одну просту рядок.
ANeves

Нові рядки та вкладки дотримуються в інтерпольованих дослідних рядках. Введіть наступне в інтерактивне вікно C #, і отримана рядок буде відформатована:. > var name = "Simon"; var templateName = "How to interpolate a verbatim string"; var now = DateTime.UtcNow;. var output = $@"Hi {name}, This template is a demo of {templateName}. It was ran at {now.ToString("o")}"; > output. Вихід"Hi Simon,\r\nThis template is a demo of How to interpolate a verbatim string.\r\n\r\nIt was ran at 2020-01-24T15:49:35.6678353Z"
Enzoaeneas

1
@Enzoaeneas Я думаю, ви переоцінили підтримку форматування в коментарях, але я розумію і згоден з тим, що ви говорите.
Лассе В. Карлсен

61

Можна комбінувати $ та @разом отримати інтерполяцію рядків та багаторядковий літеральний рядок:

var str = $@"some text { obj1.property }
     more text { obj2.property }";

Але це дасть вам NewLineхарактер між ними, тож це може бути не тим, чого ви хочете.


3
Але чи @ @ фактично не вводить подачу рядка в буквальне?
Jeremiah Gowdy

5
Це робить. Оновили свою відповідь, щоб явно сказати це.
MarcinJuraszek

Не тільки новий рядок, але і початкова вкладка (и) нового рядка. Щоб правильно зобразити фактичний формат рядка під час використання $@"у візуальній студії, ви повинні починати кожен новий рядок з крайньої лівої частини текстового редактора.
GDS

З цим рішенням ви не можете використовувати, наприклад, \ r і \ n у рядку
Йохан Францен

22

У той час як ОП запитувала щось інше, я думаю, що багато людей, які читають це питання, хотіли б багаторядковий інтерпольований варіант, $""який працює так @"". Для цього використовуйте$@""

$@"Height: {height}
Width: {width}
Background: {background}"

3
Він не хоче нових рядків у висновку, просто сам код, щоб перетворитись на різні рядки
Martin Capodici

7
Він дав зрозуміти, що ця відповідь призначена для аудиторії, яка приходить шукати, як зробити багаторядкові рядки, використовуючи синтаксис інтерполяції рядків.
Брендон Бондс

2

Це воно:

var str = $"some text { obj1.property }" +
          $" more text { obj2.property }";

Зверніть увагу на друге $в$"..." + $"..."


18
Зауважте, що це здійснить два дзвінки до String.Format, а також створить три рядки в пам'яті (Side A, Side B і A + B)
Кевін Калітовський

1
Чи це не завадило б вам використати FormattableStringамплуа на об'єднаному рядку?
binki

4
У багатьох реалізаціях сьогодні роботи на ГГц процесорі з пам'яттю Gb, додатковий виклик та додаткова рядок не створюватимуть проблем з продуктивністю. Проблеми з продуктивністю будуть викликані, наприклад, використанням алгоритму O (n2). Я думаю, що це несправедливо порушувати цього хлопця.
Йохан Францен

1

Я використовував StringBuilder в переоціненому ToString () як приклад.

    // return employee data
    public override string ToString()
    {
        StringBuilder buffer = new StringBuilder();
        buffer.AppendLine($"Number: {EmployeeNumber}");
        buffer.AppendLine($"Name: {EmployeeName}");
        buffer.AppendLine($"Address: {PostalAddress}");
        buffer.AppendLine($"Phone: {PhoneNumber}");
        buffer.AppendLine($"Age: {EmployeeAge}");
        buffer.AppendLine($"Gender: {EmployeeGender}");
        buffer.AppendLine($"Status: {EmployeeStatus}");
        buffer.AppendLine($"Manager: {EmployeeManager}");
        buffer.AppendLine($"Start: {EmployeeStartDate.ToShortDateString()}");
        return buffer.ToString();
    }

то чому б і ні buffer.AppendFormat("{0}Number: {1}", Environment.NewLine, EmployeeNumber);???
TS
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.