В этом руководстве описано, как использовать интерполяцию строк для форматирования и включения результатов выражения в строку результатов. В примерах предполагается, что вам знакомы основные принципы C# и форматирования типов .NET. Если вы не знакомы с интерполяцией строк или форматированием типов .NET, сначала ознакомьтесь с интерактивным учебником по интерполяции строк. Дополнительные сведения о типах форматирования в .NET см. в разделе "Типы форматирования" в .NET.
Введение
Для определения строкового литерала в качестве интерполированной строки добавьте к началу символ $. Вы можете внедрить любое допустимое выражение C#, возвращающее значение в интерполированной строке. В следующем примере после вычисления выражения его результат преобразуется в строку и включается в строку результатов:
C#
double a = 3;
double b = 4;
Console.WriteLine($"Area of the right triangle with legs of {a} and {b} is {0.5 * a * b}");
Console.WriteLine($"Length of the hypotenuse of the right triangle with legs of {a} and {b} is {CalculateHypotenuse(a, b)}");
doubleCalculateHypotenuse(double leg1, double leg2) => Math.Sqrt(leg1 * leg1 + leg2 * leg2);
// Output:// Area of the right triangle with legs of 3 and 4 is 6// Length of the hypotenuse of the right triangle with legs of 3 and 4 is 5
Как показано в примере, можно включить выражение в интерполированную строку, заключив его в фигурные скобки:
Как указать строку формата для выражения интерполяции
Чтобы указать строку формата, поддерживаемую типом результата выражения, следуйте выражению интерполяции с двоеточием (":") и строкой формата:
C#
{<interpolationExpression>:<formatString>}
В следующем примере показано, как задать стандартные и настраиваемые строки формата для выражений, возвращающих дату и время или числовые результаты:
C#
var date = new DateTime(1731, 11, 25);
Console.WriteLine($"On {date:dddd, MMMM dd, yyyy} L. Euler introduced the letter e to denote {Math.E:F5}.");
// Output:// On Sunday, November 25, 1731 L. Euler introduced the letter e to denote 2.71828.
Управление шириной поля и выравниванием в форматированных выражениях интерполяции
Чтобы указать минимальную ширину поля и выравнивание результата отформатированного выражения, следуйте выражению интерполяции с запятыми (",") и константным выражением:
C#
{<interpolationExpression>,<alignment>}
Если значение alignment положительное, форматированное выражение будет выровнено по правому краю, а если отрицательное — по левому.
Если вам нужно задать и выравнивание, и строку формата, начните с компонента выравнивания:
В следующем примере показано, как задать выравнивание. Текстовые поля разграничены символом вертикальной черты ("|"):
C#
constint NameAlignment = -9;
constint ValueAlignment = 7;
double a = 3;
double b = 4;
Console.WriteLine($"Three classical Pythagorean means of {a} and {b}:");
Console.WriteLine($"|{"Arithmetic",NameAlignment}|{0.5 * (a + b),ValueAlignment:F3}|");
Console.WriteLine($"|{"Geometric",NameAlignment}|{Math.Sqrt(a * b),ValueAlignment:F3}|");
Console.WriteLine($"|{"Harmonic",NameAlignment}|{2 / (1 / a + 1 / b),ValueAlignment:F3}|");
// Output:// Three classical Pythagorean means of 3 and 4:// |Arithmetic| 3.500|// |Geometric| 3.464|// |Harmonic | 3.429|
В выходных данных в примере видно, что если длина форматированного результата выражения превышает заданную ширину поля, значение alignment игнорируется.
Дополнительные сведения см. в разделе компонента выравнивания статьи о составном форматировании.
Как использовать escape-последовательности в интерполированной строке
Интерполированные строки поддерживают все escape-последовательности, которые могут использоваться в обычных строковых литералах. Дополнительные сведения см. в статье Escape-последовательности строки.
Для литеральной интерпретации escape-последовательности используйте строковый литерал verbatim. Интерполированная строка детализации начинается с обоих $ и @ символов. Вы можете использовать $ и @ в любом порядке: $@"..."@$"..." оба и являются допустимыми интерполированными подробными строками.
Как использовать троичный условный оператор ?: в выражении интерполяции
Двоеточие (:) имеет особое значение в элементе выражения интерполяции. Чтобы использовать условный оператор в выражении, заключите это выражение в скобки, как показано в следующем примере:
C#
var rand = new Random();
for (int i = 0; i < 7; i++)
{
Console.WriteLine($"Coin flip: {(rand.NextDouble() < 0.5 ? "heads" : "tails")}");
}
Создание строки результата с интерполяцией для определенного языка и региональных параметров
По умолчанию в интерполированной строке используется текущий язык и региональные параметры, определяемые свойством CultureInfo.CurrentCulture для всех операций форматирования.
var cultures = new System.Globalization.CultureInfo[]
{
System.Globalization.CultureInfo.GetCultureInfo("en-US"),
System.Globalization.CultureInfo.GetCultureInfo("en-GB"),
System.Globalization.CultureInfo.GetCultureInfo("nl-NL"),
System.Globalization.CultureInfo.InvariantCulture
};
var date = DateTime.Now;
var number = 31_415_926.536;
foreach (var culture in cultures)
{
var cultureSpecificMessage = string.Create(culture, $"{date,23}{number,20:N3}");
Console.WriteLine($"{culture.Name,-10}{cultureSpecificMessage}");
}
// Output is similar to:// en-US 8/27/2023 12:35:31 PM 31,415,926.536// en-GB 27/08/2023 12:35:31 31,415,926.536// nl-NL 27-08-2023 12:35:31 31.415.926,536// 08/27/2023 12:35:31 31,415,926.536
В более ранних версиях .NET используйте неявное преобразование интерполированной строки в System.FormattableString экземпляр и вызовите его ToString(IFormatProvider) метод для создания строки результатов, зависяющей от языка и региональных параметров. Следующий пример показывает, как это сделать:
C#
var cultures = new System.Globalization.CultureInfo[]
{
System.Globalization.CultureInfo.GetCultureInfo("en-US"),
System.Globalization.CultureInfo.GetCultureInfo("en-GB"),
System.Globalization.CultureInfo.GetCultureInfo("nl-NL"),
System.Globalization.CultureInfo.InvariantCulture
};
var date = DateTime.Now;
var number = 31_415_926.536;
FormattableString message = $"{date,23}{number,20:N3}";
foreach (var culture in cultures)
{
var cultureSpecificMessage = message.ToString(culture);
Console.WriteLine($"{culture.Name,-10}{cultureSpecificMessage}");
}
// Output is similar to:// en-US 8/27/2023 12:35:31 PM 31,415,926.536// en-GB 27/08/2023 12:35:31 31,415,926.536// nl-NL 27-08-2023 12:35:31 31.415.926,536// 08/27/2023 12:35:31 31,415,926.536
Как показано в примере, можно использовать один экземпляр FormattableString для создания нескольких строк результата для различных языков и региональных параметров.
Как создать строку результата с помощью инвариантного языка и региональных параметров
string message = string.Create(CultureInfo.InvariantCulture, $"Date and time in invariant culture: {DateTime.Now}");
Console.WriteLine(message);
// Output is similar to:// Date and time in invariant culture: 05/17/2018 15:46:24
string message = FormattableString.Invariant($"Date and time in invariant culture: {DateTime.Now}");
Console.WriteLine(message);
// Output is similar to:// Date and time in invariant culture: 05/17/2018 15:46:24
Заключение
В этом руководстве описаны распространенные сценарии использования интерполяции строк. Дополнительные сведения о интерполяции строк см. в разделе "Интерполяция строк". Дополнительные сведения о типах форматирования в .NET см. в статьях о форматировании .NET и составных статьях.
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Отзыв о .NET
.NET — это проект с открытым исходным кодом. Выберите ссылку, чтобы оставить отзыв:
Присоединитесь к серии встреч для создания масштабируемых решений искусственного интеллекта на основе реальных вариантов использования с другими разработчиками и экспертами.
Интерполяция строк с помощью маркера $обеспечивает более читаемый и удобный синтаксис для форматирования строковых выходных данных, чем традиционное составное форматирование строк.
Подробный текст, использующий "@", позволяет использовать ключевое слово C# в качестве идентификаторов или указывает, что строковый литерал следует интерпретировать подробно или различать имена атрибутов.
Узнайте о строках в программировании на C#. Сведения об объявлении и инициализации строк, неизменяемости строковых объектов и escape-последовательностях строк.