Строка Интерполяция с переменной формата
Я могу сделать это:
var log = string.Format("URL: {0}", url);
или даже так
var format = "URL: {0}"; ... var log = string.Format(format, url);
У меня есть format
определенный где-то в другом месте, и используйте переменную format
, а не встроенную строку.
- Функции C # 6.0, не работающие с Visual Studio 2015
- Каков окончательный формат для интерполяции строк в VS 2015?
- Строительство TFS 2013 .NET 4.6 / C # 6.0
- Ожидание в блоке catch
- Как включить функцию C # 6.0 в Visual Studio 2013?
В C # 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
Нужно ли использовать интерполяцию строк с объявленной ранее переменной?
C # 6, кажется, интерполирует строку inline во время компиляции. Однако рассмотрите возможность использования этой функции для локализации, определите формат в конфигурации или просто получите формат const
в classе.
- Форматирование строки в столбцы с использованием String Interpolation
- Строковая интерполяция в представлении «Бритва»?
- Строки интерполяции длинной строки в C # 6
- C # 6.0 TFS Builds
- Что такое присвоение => в C # в сигнатуре свойства
- Первичные конструкторы больше не компилируются в VS2015
- В чем разница между свойствами автогенератора и свойствами тела выражения?
- Делегирование изменений поведения кеширования в Roslyn
Нет, вы не можете использовать строчную интерполяцию с чем-то отличным от строкового литерала, поскольку компилятор создает строку «обычного» формата даже при использовании интерполяции строк.
Потому что это:
string name = "bar"; string result = $"{name}";
скомпилирован в это:
string name = "bar"; string result = string.Format("{0}", name);
строка во время выполнения должна быть «обычной» строкой формата, а не эквивалентной для интерполяции строк.
String.Format
этого вы можете использовать простой старый String.Format
.
Один из подходов к решению этой проблемы заключается в использовании lambda, содержащей интерполированную строку. Что-то вроде:
Func formatter = url => $"URL: {url}"; ... var googleUrl = "http://google.com"; ... var log = formatter(googleUrl);
В C # 7.0 вы можете использовать локальную функцию вместо lambda, чтобы сделать код немного проще и эффективнее:
string formatter(string url) => $"URL: {url}"; ... var googleUrl = "http://google.com"; ... var log = formatter(googleUrl);
Строковая интерполяция – это компилятор, а не библиотека.
Отверстия – это не имена, а выражения:
var r = new Rectangle(5, 4); var s = $"area: {r.Width + r.Heigh}":
Как вы это сделаете для локализации, как собираетесь?
Даже r
существует только во время компиляции. В IL это просто позиция в стеке переменных метода.
Я сделал то, что вы намереваетесь сделать для ресурсов и файлов конфигурации.
Поскольку у вас есть только конечный набор «переменных» для замены, то, что я сделал, был массив (или словарь, если вы предпочитаете), и используйте регулярное выражение, чтобы заменить имена в отверстиях индексом. То, что я даже допустил для спецификаторов формата.
Больше идеи, как против ответа.
В примере, показанном в вопросе, вы можете сделать следующее.
var format = "URL: "; ... var url = "http://google.com"; ... var result= $"{format} {url}";
У меня есть реальный проект, где мне нужно много чего сделать:
var label = "Some Label"; var value = "SomeValue"; //both label & value are results of some logic var result = $"{label}: {value}";
Надеюсь, это поможет кому-то.
Кажется, что вы можете сделать это так:
var googleUrl = "http://google.com"; var url = $"URL: {googleUrl}"; System.Console.WriteLine(url);
Вы можете проверить более подробную информацию на https://msdn.microsoft.com/en-us/library/dn961160.aspx