Строка Интерполяция с переменной формата

Я могу сделать это:

var log = string.Format("URL: {0}", url); 

или даже так

 var format = "URL: {0}"; ... var log = string.Format(format, url); 

У меня есть format определенный где-то в другом месте, и используйте переменную format , а не встроенную строку.

В 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 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

  • В чем смысл запланированного модификатора доступа к закрытой защите?
  • Как использовать тернарный оператор внутри интерполированной строки?
  • Как использовать функцию C # 6 «Использование статического»?
  • Работает ли C # 6.0 на .NET 4.0?
  • Веб-драйвер PhantomJS остается в памяти
  • Давайте будем гением компьютера.