12

Прошерстил весь свой справочник по C# и не смог найти что такое '$'.

Я понял только то, что это чем-то похоже на verbatim string '@'.

Console.WriteLine($"?");

Как это влияет на строку?

toxic2501
  • 125

2 Answers2

14

Префикс $ перед строкой обозначает, что далее идет интерполированная строка.

Интерполяция используется для удобного конструирования строки. При этом выражение интерполированных строк может выглядеть как шаблон строки, в котором могут быть использованы выражения языка.

Интерполированные строки легче в понимании относительно аргументов, по сравнению с композитным форматированием

Пример:

var s = $"Name = {name}, hours = {hours:hh}";

По сравнению с string.Format

var s = string.Format("Name = {0}, hours = {1:hh}", name, hours);    

Важное отличие от того же string.Format:

String interpolation is transformed at compile time to invoke an equivalent string.Format call. This leaves in place support for localization as before (though still with traditional format strings) and doesn’t introduce any post compile injection of code via strings.

Интерполированная строка в момент компиляции трансформируется в эквивалентный вызов string.Format. Это оставляет поддержку локализации как прежде (хотя все еще с традиционным форматированием строк) и не позволяет добавлять любые инъекции кода в строку, после компиляции.

Данная возможность появилась с выходом C# 6.

Подробнее можно почитать в справке на MSDN

Grundy
  • 81,538
  • А String.Format - это спецификация говорит, или просто деталь реализации? – Qwertiy Sep 14 '17 at 14:09
  • @Qwertiy, это в статье так написано, в спецификации не смотрел, что к чему – Grundy Sep 14 '17 at 14:11
3

Это интерполяция строк, удобная вещь, которая позволяет написать выражение:

int i=1;
Console.WriteLine($"i={i}");

Подробнее тут: https://msdn.microsoft.com/ru-ru/library/dn961160.aspx

  • по-русски: замена string.Format() появившаяся в C# 6 – tCode Dec 14 '16 at 08:14
  • 1
    @tCode, не замена – Grundy Dec 14 '16 at 08:15
  • @tcode Похоже я отстал от жизни со справочник по C# 4.0... – toxic2501 Dec 14 '16 at 08:17
  • 4
    @tCode Разница с string.Format в том, что паттерн резолвится во время компиляции (литералом), а в Format его можно подсовывать динамически. – free_ze Dec 14 '16 at 08:19
  • ладно ладно)))) – tCode Dec 14 '16 at 08:20
  • 1
    Ну это важный момент, таким образом интерполированная строка быстрее формирует строку, но не позволяет в рантайме использовать другой шаблон вывода. – Сергей Dec 14 '16 at 08:23
  • 1
    @Grundy для большинства способов применения - таки замена. Ну да, неполная замена получается. Но замена же! – Pavel Mayorov Dec 14 '16 at 09:18
  • @PavelMayorov, ещё вот так нельзя: "{0} smth {0}". – Qwertiy Sep 14 '17 at 14:08
  • @Qwertiy это кто вам сказал? – Pavel Mayorov Sep 14 '17 at 14:16
  • 1
    @PavelMayorov, а как ты хочешь это в интерполируемой строке сделать? Компилятор не может же подстановки объединять. – Qwertiy Sep 14 '17 at 14:37