Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Tip
Эта статья является частью раздела "Основы" для разработчиков , которые уже знают хотя бы один язык программирования и учат C#. Если вы не знакомы с программированием, сначала начните с учебных пособий по началу работы.
Вы пришли из другого языка? Интерполяция строк в C# работает так же, как литералы шаблонов в JavaScript (`${x}`) или f-strings в Python (f"{x}"). Выражение внутри {} может быть любым допустимым выражением 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)}");
double CalculateHypotenuse(double leg1, double leg2) => Math.Sqrt(leg1 * leg1 + leg2 * leg2);
// => 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# вычисляет выражение, преобразует результат в строку путем вызова метода ToString() и заменяет текст результатом. Интерполяция строки для выражения null представляет собой пустую строку. В большинстве случаев преобразование по умолчанию создает нужные выходные данные, и вам ничего больше не нужно делать.
Интерполированные строки являются более доступной для чтения альтернативой String.Format, и они поддерживают полный составной набор функций форматирования . Все, что можно делать с помощью классической строки позиционного формата — будь то спецификаторы формата, выравнивание, форматирование с учётом региональных параметров или константные строки, — можно делать и с интерполированной строкой. В остальной части этой статьи рассматриваются эти параметры. Обращайтесь к ним только тогда, когда вам нужен более точный контроль над результатом; в противном случае достаточно обычной формы $"{expression}".
Описание синтаксиса и базовых типов обработчиков см. в справочном материале Интерполированные строки. Сведения о темах, связанных с производительностью, таких как Span<char> интерполяция строк и пользовательские обработчики интерполированных строк, см. в разделе Операции со строками.
Применить строку формата
Чтобы управлять форматированием результата выражения, следуйте выражению с двоеточием и строкой стандартного или настраиваемого формата:
{<expression>:<formatString>}
В следующем примере форматируются значение DateTime и значение Double:
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}.");
// => On Sunday, November 25, 1731 L. Euler introduced the letter e to denote 2.71828.
Задайте ширину поля и выравнивание
Чтобы создать выровненные выходные данные, следуйте выражению с запятой и минимальной шириной поля. Положительные ширины выровняют значение вправо, а отрицательные ширины выравнивают его по левому краю:
{<expression>,<width>}
var titles = new Dictionary<string, string>()
{
["Doyle, Arthur Conan"] = "Hound of the Baskervilles, The",
["London, Jack"] = "Call of the Wild, The",
["Shakespeare, William"] = "Tempest, The"
};
Console.WriteLine("Author and Title List");
Console.WriteLine();
Console.WriteLine($"|{"Author",-25}|{"Title",30}|");
foreach (var title in titles)
{
Console.WriteLine($"|{title.Key,-25}|{title.Value,30}|");
}
// => Author and Title List
// =>
// => |Author | Title|
// => |Doyle, Arthur Conan |Hound of the Baskervilles, The|
// => |London, Jack | Call of the Wild, The|
// => |Shakespeare, William | Tempest, The|
Когда нужны и выравнивание, и строка формата, сначала указывайте выравнивание:
{<expression>,<width>:<formatString>}
const int NameAlignment = -9;
const int 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}|");
// => Three classical Pythagorean means of 3 and 4:
// => |Arithmetic| 3.500|
// => |Geometric| 3.464|
// => |Harmonic | 3.429|
Если форматируемое значение больше запрошенной ширины, C# игнорирует ширину и выдает полное значение.
Escape-фигурные скобки и использование escape-последовательностей
Интерполированные строки поддерживают те же экранирующие последовательности, что и обычные строковые литералы. Чтобы включить в результат буквальный символ { или }, удвойте его ({{ или }}).
Для путей и других строк, содержащих обратные косые черты, предпочтите интерполируемый необработанный строковый литерал ($"""...""") вместо более старой дословной формы ($@"..."). Необработанные строковые литералы не обрабатывают escape-последовательности, поэтому обратные косые строки отображаются as-is:
int[] xs = [1, 2, 7, 9];
int[] ys = [7, 9, 12];
Console.WriteLine($"Find the intersection of the {{{string.Join(", ", xs)}}} and {{{string.Join(", ", ys)}}} sets.");
// => Find the intersection of the {1, 2, 7, 9} and {7, 9, 12} sets.
var userName = "Jane";
var stringWithEscapes = $"C:\\Users\\{userName}\\Documents";
var rawInterpolated = $"""C:\Users\{userName}\Documents""";
Console.WriteLine(stringWithEscapes);
Console.WriteLine(rawInterpolated);
// => C:\Users\Jane\Documents
// => C:\Users\Jane\Documents
Использование условного выражения
Двоеточие имеет особое значение внутри выражения интерполяции, поэтому заключите условное выражение в скобки:
var rand = new Random(42);
for (int i = 0; i < 3; i++)
{
Console.WriteLine($"Coin flip: {(rand.NextDouble() < 0.5 ? "heads" : "tails")}");
}
Расположить выражение на нескольких строках
Для удобства чтения разбивайте длинные выражения интерполяции на несколько строк. Выражения интерполяции с несколькими строками доступны с версии C# 11. В следующем примере добавляются новые линии между { символами и } символами для разделения интерполированных выражений из литерального текста:
int[] numbers = [3, 1, 4, 1, 5, 9, 2, 6];
Console.WriteLine($"Total: {
numbers.Sum()
}, average: {numbers.Average():F2}.");
// => Total: 31, average: 3.88.
Создание строковых констант
Вы можете создавать интерполированные строки констант, когда каждое интерполированное выражение является константным значением. Это делает его пригодным для аргументов атрибутов, switch шаблонов и других контекстов, требующих констант времени компиляции:
const string Audience = "world";
const string Greeting = $"Hello, {Audience}!";
Console.WriteLine(Greeting);
// => Hello, world!
Форматирование с использованием определенной культуры
По умолчанию интерполированная строка форматирует значения с помощью CultureInfo.CurrentCulture, что влияет на представление даты, чисел и денежных значений. Для детерминированного вывода передайте явно заданную культуру в String.Create(IFormatProvider, DefaultInterpolatedStringHandler):
CultureInfo[] cultures =
[
CultureInfo.GetCultureInfo("en-US"),
CultureInfo.GetCultureInfo("en-GB"),
CultureInfo.GetCultureInfo("nl-NL"),
CultureInfo.InvariantCulture
];
var date = new DateTime(2026, 5, 21, 12, 35, 31);
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 5/21/2026 12:35:31 PM 31,415,926.536
// => en-GB 21/05/2026 12:35:31 31,415,926.536
// => nl-NL 21-05-2026 12:35:31 31.415.926,536
// => 05/21/2026 12:35:31 31,415,926.536
Для инвариантных выходных данных (журналы, форматы файлов, данные, доступные для чтения компьютером), передайте CultureInfo.InvariantCulture:
var timestamp = new DateTime(2026, 5, 21, 15, 46, 24);
string message = string.Create(CultureInfo.InvariantCulture, $"Date and time in invariant culture: {timestamp}");
Console.WriteLine(message);
// => Date and time in invariant culture: 05/21/2026 15:46:24