Строка Интерполяция с переменной формата
Я могу это сделать:
var log = string.Format("URL: {0}", url);
или даже как это
var format = "URL: {0}";
...
var log = string.Format(format, url);
У меня есть format
, определенный где-то в другом месте, и используйте переменную format
, а не встроенную строку.
В С# 6 это кажется невозможным:
var format = $"URL: {url}"; // Error url does not exist
...
var url = "http://google.com";
...
var log = $format; // The way to evaluate string interpolation here
Можно ли использовать интерполяцию строк с объявленной ранее переменной?
С# 6, кажется, интерполирует строку inline во время компиляции. Однако рассмотрите возможность использования этой функции для локализации, определите формат в конфигурации или просто укажите формат const
в классе.
Ответы
Ответ 1
Нет, вы не можете использовать интерполяцию строк с чем-то отличным от строкового литерала, поскольку компилятор создает строку "обычного" формата даже при использовании интерполяции строк.
Потому что это:
string name = "bar";
string result = $"{name}";
заключается в следующем:
string name = "bar";
string result = string.Format("{0}", name);
строка во время выполнения должна быть "обычной" строкой формата, а не эквивалентной для интерполяции строк.
Вместо этого вы можете использовать простой старый String.Format
.
Ответ 2
Одним из подходов к работе над этим было бы использование лямбда, содержащей интерполированную строку. Что-то вроде:
Func<string, string> formatter = url => $"URL: {url}";
...
var googleUrl = "http://google.com";
...
var log = formatter(googleUrl);
В С# 7.0 вы можете использовать локальную функцию вместо лямбда, чтобы сделать код немного более простым и эффективным:
string formatter(string url) => $"URL: {url}";
...
var googleUrl = "http://google.com";
...
var log = formatter(googleUrl);
Ответ 3
Интерполяция строк - это компилятор, а не библиотека.
Отверстия - это не имена, а выражения:
var r = new Rectangle(5, 4);
var s = $"area: {r.Width + r.Heigh}":
Как вы это сделаете для локализации, как собираетесь?
Даже r
существует только во время компиляции. В IL это просто позиция в стеке переменных метода.
Я сделал то, что вы намереваетесь сделать для ресурсов и файлов конфигурации.
Поскольку у вас может быть только конечный набор "переменных", чтобы заменить, то, что я сделал, был массив (или словарь, если вы предпочитаете), и используйте регулярное выражение для замены имен в отверстиях индексом. То, что я даже допустил для спецификаторов формата.
Ответ 4
Кажется, что вы можете сделать это следующим образом:
var googleUrl = "http://google.com";
var url = $"URL: {googleUrl}";
System.Console.WriteLine(url);
Вы можете проверить более подробную информацию в https://msdn.microsoft.com/en-us/library/dn961160.aspx