Что означает знак $$ в С# 6.0?

В исходном коде MVC 6 я увидел несколько строк кода, в которых есть строки с указателями $.

Как я никогда раньше не видел, я думаю, что это новое в С# 6.0. Я не уверен. (Надеюсь, я прав, иначе я был бы потрясен, потому что я никогда раньше не пересекал его.

Это было похоже:

var path = $"'{pathRelative}'";

Ответ 1

Вы правы, это новая функция С# 6.

Знак $ перед строкой позволяет использовать интерполяцию строк. Компилятор будет разбирать строку специально, и любые выражения внутри фигурных скобок будут оцениваться и вставляться в строку на месте.

Под капотом он преобразуется в одно и то же:

var path = string.Format("'{0}'", pathRelative);

Посмотрим на IL для этого фрагмента:

var test = "1";
var val1 = $"{test}";
var val2 = string.Format("{0}", test);

Что компилируется:

// var test = "1";
IL_0001: ldstr "1"
IL_0006: stloc.0

// var val1 = $"{test}";
IL_0007: ldstr "{0}"
IL_000c: ldloc.0
IL_000d: call string [mscorlib]System.String::Format(string, object)
IL_0012: stloc.1

// var val2 = string.Format("{0}", test);
IL_0013: ldstr "{0}"
IL_0018: ldloc.0
IL_0019: call string [mscorlib]System.String::Format(string, object)
IL_001e: stloc.2

Таким образом, эти два экземпляра идентичны в скомпилированном приложении.


Заметка о синтаксисе интерполяции строк С#: К сожалению, воды сейчас запутаны в строковой интерполяции, потому что исходный предварительный просмотр С# 6 имел различный синтаксис, который получил много внимания в блогах на раннем этапе. Вы все равно увидите много ссылок на использование обратных косых черт для интерполяции строк, но это уже не синтаксически корректно.