Ответ 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 имел различный синтаксис, который получил много внимания в блогах на раннем этапе. Вы все равно увидите много ссылок на использование обратных косых черт для интерполяции строк, но это уже не синтаксически корректно.