$
является сокращением для String.Format
и используется со строковыми интерполяциями, что является новой функцией C # 6. Как используется в вашем случае, он ничего не делает, так же, как string.Format()
ничего не делает.
Он вступает в свои права, когда используется для построения строк со ссылкой на другие значения. Что раньше должно было быть написано как:
var anInt = 1;
var aBool = true;
var aString = "3";
var formated = string.Format("{0},{1},{2}", anInt, aBool, aString);
Сейчас становится:
var anInt = 1;
var aBool = true;
var aString = "3";
var formated = $"{anInt},{aBool},{aString}";
Существует также альтернативная - менее известная - форма интерполяции строк $@
(порядок двух символов важен). Он позволяет @""
смешивать свойства строки для $""
поддержки интерполяции строк без необходимости использования \\
всей строки. Итак, следующие две строки:
var someDir = "a";
Console.WriteLine($@"c:\{someDir}\b\c");
будет выводить:
c:\a\b\c
$@
, то вы вынуждены бежать с помощью"
символа""
. Это не тот случай, когда вы используете только$
.Создает интерполированную строку .
Из MSDN
пример:
Вы можете использовать выражения в интерполированной строке
Приятно то, что вам не нужно беспокоиться о порядке параметров, как вы это делаете
String.Format
.Теперь, если вы хотите удалить некоторые параметры, вам нужно перейти и обновить все значения, что уже не так.
Обратите внимание, что старый добрый текст
string.format
по-прежнему актуален, если вы хотите указать культурную информацию в своем форматировании .источник
$
и указать данные культуры , если преобразовать данные в строку внутри$
выражения , используя правильную культуру, например,{somevar.ToString(...,[Insert culture info here])}
.Пример кода
Вывод
Это интерполированные строки . Вы можете использовать интерполированную строку везде, где можете использовать строковый литерал. Когда ваша программа будет выполнять код с интерполированным строковым литералом, код вычисляет новый строковый литерал, вычисляя выражения интерполяции. Это вычисление происходит каждый раз, когда выполняется код с интерполированной строкой.
В следующем примере создается строковое значение, в котором были вычислены все значения интерполяции строки. Это окончательный результат и имеет тип строки. Все вхождения двойных фигурных скобок
(“{{“ and “}}”)
преобразуются в одну фигурную скобку.После выполнения выше 2 строк, переменная
message
содержит «Hello, World».Ссылка - MSDN
источник
Классная особенность. Я просто хочу подчеркнуть, почему это лучше, чем string.format, если это не очевидно для некоторых людей.
Я прочитал, что кто-то говорит, что строка string.format соответствует "{0} {1} {2}", чтобы соответствовать параметрам. Вы не обязаны заказывать "{0} {1} {2}" в string.format, вы также можете выполнить "{2} {0} {1}". Однако, если у вас много параметров, например, 20, вы действительно хотите упорядочить строку как "{0} {1} {2} ... {19}". Если это случайный беспорядок, вам будет трудно выстроить свои параметры.
С помощью $ вы можете добавить параметр в строку без подсчета ваших параметров. Это делает код намного проще для чтения и обслуживания.
Недостатком $ является то, что вы не можете легко повторить параметр в строке, вы должны ввести его. Например, если вы устали набирать System.Environment.NewLine, вы можете выполнить string.format ("... {0} ... {0} ... {0}", System.Environment.NewLine), но в $ вы должны повторить это. Вы не можете сделать $ "{0}" и передать его в string.format, потому что $ "{0}" возвращает "0".
На примечании стороны я прочитал комментарий в другом дублированном tpoic. Я не мог комментировать, так что вот оно. Он сказал, что
создает более одного строкового объекта. Это не правда на самом деле. Если вы делаете это в одной строке, он создает только одну строку и помещается в кеш строк.
Все они возвращают строку и создают только одно значение в кеше.
С другой стороны:
Создает 4 разных значения в кеше, потому что есть 4 ";".
Таким образом, будет проще написать код, подобный следующему, но вы бы создали пять интерполированных строк, как исправил Карлос Муньос:
Это создает одну единственную строку в кэше, в то время как у вас очень легко читаемый код. Я не уверен в производительности, но я уверен, что MS оптимизирует это, если еще не делает это.
источник
String.Format()
а затем сцепляется во время выполнения сString.Concat
. Поэтому лучше не разбивать его на несколько строкОбратите внимание, что вы также можете объединить два, что довольно круто (хотя выглядит немного странно):
источник
$@
или@$
. К сожалению, это может быть только$@
@
определяет, как представить строковый литерал.$
это ярлык дляstring.Format
. Думайте об этом как$(@"");
string.Format
. Это сладко для представления значения, которое анализируется для astring.Format
, поэтому оно частично имеет смысл, но не полностью.$
это в основном неявный вызов функции, тогда как он@
является частью литерала, как иm
десятичный литерал. Вот почему есть только один логический порядок.$
, но для максимальной совместимости, а не для жесткого кодирования, является ли разделитель каталогов '/' или '\', а также во избежание неизбежного сбоя, вызывающего двойной слеш или отсутствующий слеш, где должен был один, я рекомендую использоватьPath.Combine()
вместо использования конкатенации строк при работе с каталогами и файлами.Это удобнее, чем string.Format, и вы также можете использовать intellisense здесь.
И вот мой метод испытаний:
источник
Это означает интерполяцию строки.
Это защитит вас, потому что это добавит защиту времени компиляции при оценке строки.
Вы больше не получите исключение с
string.Format("{0}{1}",secondParamIsMissing)
источник
В следующем примере подчеркиваются различные преимущества использования интерполированных строк по сравнению
string.Format()
с чистотой и удобочитаемостью. Это также показывает, что код внутри{}
вычисляется как любой другой аргумент функции, как если быstring.Format()
мы вызывались.источник
Синтаксис $ хорош, но с одним недостатком.
Если вам нужно что-то вроде строкового шаблона, который объявляется на уровне класса как поле ... ну в одном месте, как и должно быть.
Затем вы должны объявить переменные на том же уровне ... что не очень круто.
Гораздо приятнее использовать строку. Синтаксис формата для такого рода вещей
Использование глобалов не очень хорошо и, кроме того, оно не работает и с глобалами.
источник
Я не знаю, как это работает, но вы также можете использовать его для отображения ваших значений!
Пример :
Конечно, вы можете заменить «это!» с любой переменной или чем-то значимым, так же как вы можете изменить вкладку.
источник
знак $ в строке предназначен для определения строки интерполяции, которая является функцией в C #, для интерполяции строки является «истинной строкой», которая может содержать интерполированные выражения
для получения дополнительной информации это источник ответа и пример: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated
источник