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

C# 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}";

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

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

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

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

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

3 ответов


вы можете комбинировать $ и @ вместе, чтобы получить многострочный интерполированный строковый литерал:

string s =
$@"Height: {height}
Width: {width}
Background: {background}";

источник: длинные строки интерполяции строк в C#6 (спасибо @Ric для поиска нити!)


Я бы, вероятно, использовать сочетание

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

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

например

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

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

этой будет имеют дополнительные накладные расходы по сравнению с использованием$@"", но только в наиболее важных приложениях производительности это будет заметно. В память строковые операции очень дешево по сравнению с данными ввода/вывода значение одной переменной из БД будет занимать в сотни раз в большинстве случаев дольше.