Что означает строковый префикс ‘$’, когда он не используется для интерполяции?

#c# #.net-core #c#-6.0

#c# #.net-core #c #-6.0

Вопрос:

Я только что наткнулся на этот код в статье о конфигурации .NET Core, и ключи словаря выглядят для меня очень чуждыми:

 static IReadOnlyDictionary<string, string> DefaultConfigurationStrings{get;} = new Dictionary<string, string>()
    {
        ["Profile:UserName"] = Environment.UserName,
        [$"AppConfiguration:ConnectionString"] = DefaultConnectionString,
        [$"AppConfiguration:MainWindow:Height"] = "400",
        [$"AppConfiguration:MainWindow:Width"] = "600",
        [$"AppConfiguration:MainWindow:Top"] = "0",
        [$"AppConfiguration:MainWindow:Left"] = "0",
    };
  

Почему $ и почему [...] ? Что-то связанное с отказом от использования пар ключ-значение, разделенных запятыми?

Комментарии:

1. [] является частью синтаксиса инициализатора новой индексированной коллекции. Не могу объяснить, почему там есть $ s…

2. знак ‘$’ здесь бесполезен.

3. Я не думаю, что $ имеет какое-либо другое использование, кроме интерполяции, добавленной в C # 6. Если это так, то это приведет к странной путанице и поднимет вопрос, почему разработчики выбрали его в первую очередь для этой новой функции. Я очень подозреваю, что удаление этого $ в этом примере не будет иметь никакого эффекта.

Ответ №1:

Скобки — это новые инициализаторы индекса. Это просто еще один способ инициализации словаря, который немного более удобочитаем, чем инициализаторы коллекции, которые были там раньше.

Что касается строк, когда не используются интерполяции, это просто простая строка, не более того. Предположительно, компилятор даже не будет генерировать string.Format вызов для таких строк. Вы $ также можете удалить его (то же самое с дословными строковыми литералами, когда не используются какие-либо другие функции).

Однако одной из возможных причин появления $"" строк может быть то, что это намек либо препроцессору исходного кода, либо инструменту статического анализа на то, что строка является какой-то особенной. Я видел нечто подобное, используемое с дословными строковыми литералами, чтобы ReSharper не предлагал перевести строку для i18n. Однако это то, что вы должны искать в своей среде сборки.

Комментарии:

1. Ах, я читал о них, но потом полностью забыл их, наслаждаясь другими новыми функциями C #, такими как интерполяция и инициализаторы автоматических свойств. .