$ — интерполяция строк (справочник по C#)$ - string interpolation (C# Reference)

Специальный знак $ идентифицирует строковый литерал как интерполированную строку.The $ special character identifies a string literal as an interpolated string. Интерполированная строка — это строковый литерал, который может содержать выражения интерполяции.An interpolated string is a string literal that might contain interpolation expressions. При разрешении интерполированной строки в результирующую элементы с выражениями интерполяции заменяются строковыми представлениями результатов выражений.When an interpolated string is resolved to a result string, items with interpolation expressions are replaced by the string representations of the expression results. Эта возможность доступна в C# 6 и более поздних версиях.This feature is available in C# 6 and later versions of the language.

Интерполяция строк предоставляет более понятный и удобный синтаксис для создания форматированных строк по сравнению с функцией составного форматирования строк.String interpolation provides a more readable and convenient syntax to create formatted strings than a string composite formatting feature. В следующем примере обе этих функции используются для получения одинаковых выходных данных:The following example uses both features to produce the same output:

string name = "Mark";
var date = DateTime.Now;

// Composite formatting:
Console.WriteLine("Hello, {0}! Today is {1}, it's {2:HH:mm} now.", name, date.DayOfWeek, date);
// String interpolation:
Console.WriteLine($"Hello, {name}! Today is {date.DayOfWeek}, it's {date:HH:mm} now.");
// Both calls produce the same output that is similar to:
// Hello, Mark! Today is Wednesday, it's 19:40 now.

Структура интерполированной строкиStructure of an interpolated string

Для определения строкового литерала в качестве интерполированной строки добавьте к началу символ $.To identify a string literal as an interpolated string, prepend it with the $ symbol. Между $ и " в начале строкового литерала не может быть пробела.You cannot have any white space between the $ and the " that starts a string literal. Это приводит к ошибке времени компиляции.Doing so causes a compile-time error.

Структура элемента с выражением интерполяции выглядит следующим образом:The structure of an item with an interpolation expression is as follows:

{<interpolationExpression>[,<alignment>][:<formatString>]}

Элементы в квадратных скобках являются необязательными.Elements in square brackets are optional. Каждый из элементов описан в таблице ниже:The following table describes each element:

ЭлементElement ОписаниеDescription
interpolationExpression Выражение, создающее форматируемый результат.The expression that produces a result to be formatted. Строковым представлением результата null является String.Empty.String representation of the null result is String.Empty.
alignment Константное выражение, значение которого определяет минимальное число символов в строковом представлении результата выражения интерполяции.The constant expression whose value defines the minimum number of characters in the string representation of the result of the interpolation expression. Если оно положительное, строковое представление выравнивается по правому краю, если отрицательное — по левому краю.If positive, the string representation is right-aligned; if negative, it's left-aligned. Дополнительные сведения см. в разделе Компонент выравнивания.For more information, see Alignment Component.
formatString Строка форматирования, поддерживаемая типом результата выражения.A format string that is supported by the type of the expression result. Дополнительные сведения см. в разделе Компонент строки форматирования.For more information, see Format String Component.

В следующем примере используются необязательные компоненты форматирования, описанные выше:The following example uses optional formatting components described above:

Console.WriteLine($"|{"Left",-7}|{"Right",7}|");

const int FieldWidthRightAligned = 20;
Console.WriteLine($"{Math.PI,FieldWidthRightAligned} - default formatting of the pi number");
Console.WriteLine($"{Math.PI,FieldWidthRightAligned:F3} - display only three decimal digits of the pi number");
// Expected output is:
// |Left   |  Right|
//     3.14159265358979 - default formatting of the pi number
//                3.142 - display only three decimal digits of the pi number    

Специальные символыSpecial characters

Чтобы включить в текст, создаваемый интерполированной строкой, фигурную скобку "{" или "}", используйте две фигурные скобки — "{{" или "}}".To include a brace, "{" or "}", in the text produced by an interpolated string, use two braces, "{{" or "}}". Подробнее см. в разделе Экранирование фигурных скобок.For more information, see Escaping Braces.

Двоеточие (:) имеет особое значение в элементе выражения интерполяции. Чтобы использовать условный оператор в выражении интерполяции, заключите это выражение в скобки.As the colon (":") has special meaning in an interpolation expression item, in order to use a conditional operator in an interpolation expression, enclose that expression in parentheses.

В следующем примере показано, как включить фигурную скобку в результирующую строку, а также использовать условный оператор в выражении интерполяции:The following example shows how to include a brace in a result string and how to use a conditional operator in an interpolation expression:

string name = "Horace";
int age = 34;
Console.WriteLine($"He asked, \"Is your name {name}?\", but didn't wait for a reply :-{{");
Console.WriteLine($"{name} is {age} year{(age == 1 ? "" : "s")} old.");
// Expected output is:
// He asked, "Is your name Horace?", but didn't wait for a reply :-{
// Horace is 34 years old.

В буквальных интерполированных строках используется символ $, за которым следует символ @.A verbatim interpolated string starts with the $ character followed by the @ character. Дополнительные сведения о буквальных строках см. в разделах о строках и буквальном идентификаторе).For more information about verbatim strings, see the string and verbatim identifier topics.

Примечание

В буквальной интерполированной строке токен $ должен находиться перед токеном @.The $ token must appear before the @ token in a verbatim interpolated string.

Неявные преобразования и указание реализации IFormatProviderImplicit conversions and specifying IFormatProvider implementation

Существует три неявных преобразования из интерполированных строк.There are three implicit conversions from an interpolated string:

  1. Преобразование интерполированной строки в экземпляр String, являющийся результатом разрешения интерполированной строки, где элементы выражения интерполяции заменяются на должным образом форматированные строковые представления их результатов.Conversion of an interpolated string to a String instance that is the result of interpolated string resolution with interpolation expression items being replaced with the properly formatted string representations of their results. Это преобразование использует текущие значения языка и региональных параметров.This conversion uses the current culture.

  2. Преобразование интерполированной строки в экземпляр FormattableString, представляющий строку составного формата, а также форматируемые результаты выражения.Conversion of an interpolated string to a FormattableString instance that represents a composite format string along with the expression results to be formatted. Это позволяет создавать несколько результирующих строк с содержимым для конкретного языка из одного экземпляра FormattableString.That allows you to create multiple result strings with culture-specific content from a single FormattableString instance. Для этого вызовите один из следующих методов:To do that call one of the following methods:

    Также можно использовать метод ToString(IFormatProvider), чтобы предоставить пользовательские реализации интерфейса IFormatProvider, который поддерживает настраиваемое форматирование.You also can use the ToString(IFormatProvider) method to provide a user-defined implementation of the IFormatProvider interface that supports custom formatting. Дополнительные сведения см. в разделе Настраиваемое форматирование с использованием интерфейса ICustomFormatter.For more information, see Custom Formatting with ICustomFormatter.

  3. Преобразование интерполированной строки в экземпляр IFormattable, который также позволяет создавать несколько результирующих строк с содержимым для конкретного языка из одного экземпляра IFormattable.Conversion of an interpolated string to an IFormattable instance that also allows you to create multiple result strings with culture-specific content from a single IFormattable instance.

В следующем примере используется неявное преобразование в FormattableString для создания результирующих строк для конкретного языка:The following example uses implicit conversion to FormattableString to create culture-specific result strings:

double speedOfLight = 299792.458;
FormattableString message = $"The speed of light is {speedOfLight:N3} km/s.";

System.Globalization.CultureInfo.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo("nl-NL");
string messageInCurrentCulture = message.ToString();

var specificCulture = System.Globalization.CultureInfo.GetCultureInfo("en-IN");
string messageInSpecificCulture = message.ToString(specificCulture);

string messageInInvariantCulture = FormattableString.Invariant(message);

Console.WriteLine($"{System.Globalization.CultureInfo.CurrentCulture,-10} {messageInCurrentCulture}");
Console.WriteLine($"{specificCulture,-10} {messageInSpecificCulture}");
Console.WriteLine($"{"Invariant",-10} {messageInInvariantCulture}");
// Expected output is:
// nl-NL      The speed of light is 299.792,458 km/s.
// en-IN      The speed of light is 2,99,792.458 km/s.
// Invariant  The speed of light is 299,792.458 km/s.

Дополнительные ресурсыAdditional resources

Если вы не знакомы с интерполяцией строк, ознакомьтесь с интерактивным руководством по интерполяции строк в C#.If you are new to string interpolation, see the String interpolation in C# interactive tutorial. Вы также можете изучить другой учебник, Интерполяция строк в C# , в котором показано, как использовать интерполированные строки для форматирования.You also can check another String interpolation in C# tutorial that demonstrates how to use interpolated strings to produce formatted strings.

Компиляция интерполированных строкCompilation of interpolated strings

Если интерполированная строка имеет тип string, обычно она преобразуется в вызов метода String.Format.If an interpolated string has the type string, it's typically transformed into a String.Format method call. Компилятор может заменить String.Format на String.Concat, если проанализированное поведение будет эквивалентно объединению.The compiler may replace String.Format with String.Concat if the analyzed behavior would be equivalent to concatenation.

Если интерполированная строка имеет тип IFormattable или FormattableString, компилятор создает вызов метода FormattableStringFactory.Create.If an interpolated string has the type IFormattable or FormattableString, the compiler generates a call to the FormattableStringFactory.Create method.

Спецификация языка C#C# language specification

Дополнительные сведения см. в разделе Интерполированные строки спецификации языка C#.For more information, see the Interpolated strings section of the C# language specification.

См. такжеSee also