Подтвердить что ты не робот

Многострочный строковый литерал С#

С# 6 предоставляет поддержку компилятора для интерполированных строковых литералов с синтаксисом:

var person = new { Name = "Bob" };

string s = $"Hello, {person.Name}.";

Это отлично подходит для коротких строк, но если вы хотите создать более длинную строку, она должна быть указана в одной строке?

С другими типами строк вы можете:

    var multi1 = string.Format(@"Height: {0}
Width: {1}
Background: {2}",
        height,
        width,
        background);

Или:

var multi2 = string.Format(
    "Height: {1}{0}" +
    "Width: {2}{0}" +
    "Background: {3}",
    Environment.NewLine,
    height,
    width,
    background);

Я не могу найти способ добиться этого с помощью строковой интерполяции, не имея всего одной строки:

var multi3 = $"Height: {height}{Environment.NewLine}Width: {width}{Environment.NewLine}Background: {background}";

Я понимаю, что в этом случае вы можете использовать \r\n вместо Environment.NewLine (менее переносимый) или вытащить его на локальный, но будут случаи, когда вы не можете уменьшить его ниже одной строки без теряя смысловую силу.

Это просто случай, когда строчная интерполяция не должна использоваться для длинных строк?

Должны ли мы просто использовать StringBuilder для более длинных строк?

var multi4 = new StringBuilder()
    .AppendFormat("Width: {0}", width).AppendLine()
    .AppendFormat("Height: {0}", height).AppendLine()
    .AppendFormat("Background: {0}", background).AppendLine()
    .ToString();

Или есть что-то более элегантное?

4b9b3361

Ответ 2

Я бы использовал комбинацию

var builder = new StringBuilder()
    .AppendLine($"Width: {width}")
    .AppendLine($"Height: {height}")
    .AppendLine($"Background: {background}");

Ответ 3

Лично я просто добавляю еще одну интерполированную строку, используя конкатенацию строк

Например

var multi  = $"Height     : {height}{Environment.NewLine}" +
             $"Width      : {width}{Environment.NewLine}" +
             $"Background : {background}";

Я считаю, что легче форматировать и читать.

Это будет иметь дополнительные накладные расходы по сравнению с использованием [email protected]"", но только в наиболее критичных для производительности приложениях это будет заметно. Операции с памятью чрезвычайно дешевы по сравнению с данными ввода/вывода. Чтение одной переменной из db в большинстве случаев займет в сотни раз больше.