$ — интерполяция строк (справочные материалы по 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 starting with C# 6.

Интерполяция строк предоставляет более понятный и удобный синтаксис для создания форматированных строк по сравнению с функцией составного форматирования строк.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.

Структура элемента с выражением интерполяции выглядит следующим образом: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 null is String.Empty.
alignment Константное выражение, значение которого определяет минимальное количество символов в строковом представлении результата выражения.The constant expression whose value defines the minimum number of characters in the string representation of the expression result. Если оно положительное, строковое представление выравнивается по правому краю, если отрицательное — по левому краю.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.

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

Примечание

Начиная с C# 8.0 маркеры $ и @ можно использовать в любом порядке: $@"..." и @$"..." являются допустимыми интерполированными строками verbatim.Starting with C# 8.0, you can use the $ and @ tokens in any order: both $@"..." and @$"..." are valid interpolated verbatim strings. В более ранних версиях C# маркер$ должен располагаться перед маркером @.In earlier C# versions, the $ token must appear before the @ token.

Неявные преобразования и указание реализации IFormatProviderImplicit conversions and how to specify 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. Это преобразование использует CurrentCulture для форматирования результатов выражений.This conversion uses the CurrentCulture to format expression results.

  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. Дополнительные сведения см. в статье Типы форматирования в .NET, разделе Настраиваемое форматирование с использованием интерфейса ICustomFormatter.For more information, see the Custom formatting with ICustomFormatter section of the Formatting types in .NET article.

  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