что такое интерполяция строк
Интерполяция строк на C#
Примеры C# в этой статье выполняются во встроенном средстве выполнения кода и на площадке Try.NET. Нажмите на кнопку Выполнить, чтобы выполнить пример в интерактивном окне. После выполнения кода вы можете изменить его и выполнить измененный код, снова нажав на кнопку Выполнить. Либо в интерактивном окне выполняется измененный код, либо, если компиляция завершается с ошибкой, в интерактивном окне отображаются все сообщения об ошибках компилятора C#.
Введение
Функция интерполяции строк создана на основе функции составного форматирования и имеет более удобный синтаксис для включения форматированных результатов выражения в строку результатов.
Как показано в примере, можно включить выражение в интерполированную строку, заключив его в фигурные скобки:
Интерполированные строки поддерживают все возможности составного форматирования строк. Это делает их более удобочитаемыми по сравнению с использованием метода String.Format.
Как указать строку формата для выражения интерполяции
Задайте строку формата, которая поддерживается типом результата выражения, указав ее после выражения интерполяции через двоеточие:
В следующем примере показано, как задать стандартные и настраиваемые строки формата для выражений, возвращающих дату и время или числовые результаты:
Управление шириной поля и выравниванием в форматированных выражениях интерполяции
Задайте минимальную ширину поля и выравнивание форматированного результата выражения, указав константное выражение после выражения интерполяции через запятую:
Если значение alignment положительное, форматированное выражение будет выровнено по правому краю, а если отрицательное — по левому.
Если вам нужно задать и выравнивание, и строку формата, начните с компонента выравнивания:
В следующем примере показано, как задать выравнивание. Текстовые поля разграничены символом вертикальной черты («|»):
В выходных данных в примере видно, что если длина форматированного результата выражения превышает заданную ширину поля, значение alignment игнорируется.
Дополнительные сведения см. в разделе Компонент выравнивания в статье Составное форматирование.
Как использовать escape-последовательности в интерполированной строке
Интерполированные строки поддерживают все escape-последовательности, которые могут использоваться в обычных строковых литералах. Дополнительные сведения см. в статье Escape-последовательности строки.
В строке результатов указывайте двойную фигурную скобку «<<" или ">>». Дополнительные сведения см. в разделе escape-скобки в статье Составное форматирование.
В следующем примере показано, как включить фигурные скобки в строку результата и создать интерполированную строку verbatim:
Двоеточие (:) имеет особое значение в элементе выражения интерполяции. Чтобы использовать условный оператор в выражении, заключите это выражение в скобки, как показано в следующем примере:
Создание строки результата с интерполяцией для определенного языка и региональных параметров
По умолчанию в интерполированной строке используется текущий язык и региональные параметры, определяемые свойством CultureInfo.CurrentCulture для всех операций форматирования. Используйте неявное преобразование интерполированной строки для экземпляра System.FormattableString и вызовите метод ToString(IFormatProvider), чтобы создать строку результата с определенным языком и региональными параметрами. Следующий пример показывает, как это сделать:
Как показано в примере, можно использовать один экземпляр FormattableString для создания нескольких строк результата для различных языков и региональных параметров.
Как создать строку результата с помощью инвариантного языка и региональных параметров
Наряду с методом FormattableString.ToString(IFormatProvider) можно использовать статический метод FormattableString.Invariant, чтобы разрешить интерполированную строку в строке результата для InvariantCulture. Следующий пример показывает, как это сделать:
Заключение
Создание форматированных строк с помощью интерполяции
В этом руководстве описывается, как с помощью интерполяции строк вставить значения в одну строку. Вы также узнаете, как управлять форматированием текста результирующей строки. Вы напишете и выполните код C# в браузере и сразу же сможете просмотреть результаты.
Создание интерполированной строки
Запустите приведенный ниже код в интерактивном окне. Нажмите кнопку Перейти в режим фокусировки. Затем введите следующий блок кода в интерактивном окне (замените своим именем) и нажмите кнопку Выполнить:
При запуске кода в окне Вывод отображается строка, которая содержит ваше имя в приветствии. Строковым аргументом в вызове метода WriteLine является выражение интерполированной строки. Это похоже на шаблон, позволяющий создать одну строку (называемую результирующей строкой) из строки, содержащей внедренный код. Выражения интерполированной строки особенно удобны при вставке значений в строку или сцеплении (объединении) нескольких строк.
Приведенный выше пример содержит два элемента, обязательные для каждого выражения интерполированной строки:
Одно или несколько интерполированных выражений. Интерполированное выражение обозначено открывающей и закрывающей фигурной скобкой ( < и >). Вы можете указать внутри фигурных скобок любое выражение C#, возвращающее значение (включая null ).
Давайте рассмотрим еще несколько примеров интерполяции строк с другими типами данных.
Включение разных типов данных
В предыдущем шаге вы использовали интерполяцию строк для вставки одной строки внутрь другой. При этом интерполированное выражение, включенное в выражение интерполированной строки, может относиться к любому типу данных. Давайте включим в интерполированную строку значения разных типов данных.
Обратите внимание на то, что интерполированное выражение item.Price в интерполированной строке разрешается в текст 1.99 в результирующей строке. Связано это с тем, что если результат выражения не имеет строковый тип, он разрешается в строку описанным ниже образом.
В выходных данных этого примера дата является слишком точной (цена на баклажаны не меняется каждую секунду), а в значении цены не указана единица валюты. В следующем шаге вы узнаете, как устранить эти проблемы, управляя форматом строковых представлений результатов выражений.
Управление форматированием интерполированных выражений
В предыдущем шаге мы вставили две неправильно отформатированные строки в результирующую строку. Первая была значением даты и времени, при этом допустимой была только дата. Вторая была ценой, в которой отсутствовала единица валюты. Обе эти проблемы легко решить. Интерполяция строк позволяет указывать строки формата, управляющие форматированием определенных типов. Измените вызов Console.WriteLine из предыдущего примера, включив в него строки формата для выражений даты и цены, как показано в следующей строке:
Задайте строку формата, указав ее после интерполированного выражения через двоеточие. «d» — это стандартная строка формата для даты и времени, представляющая краткий формат. «C2» — это стандартная строка числового формата, представляющая число в виде денежной единицы с точностью два знака после запятой.
Попробуйте изменить строки формата в примере, чтобы узнать, как они влияют на форматирование даты и времени, а также числового значения. Измените «d» в
Кроме форматирования, вы можете управлять шириной поля и выравниванием для форматированных строк, включаемых в результирующую строку. В следующем шаге вы научитесь это делать.
Создание форматированных строк с помощью интерполяции
В этом руководстве объясняется, как с помощью интерполяции строк в C# вставить значения в одну результирующую строку. Вы напишете код C# и сможете просмотреть результаты его компиляции и выполнения. Это руководство содержит ряд уроков по вставке значений в строки и форматированию этих значений различными способами.
Создание интерполированной строки
Создайте каталог с именем interpolated. Сделайте его текущим, выполнив следующую команду в окне консоли:
Откройте файл Program.cs в любом редакторе и замените строку Console.WriteLine(«Hello World!»); следующим кодом, указав вместо свое имя:
Чтобы выполнить этот код, введите dotnet run в окне консоли. При запуске программы отображается одна строка, которая содержит ваше имя в приветствии. Строка, включенная в вызов метода WriteLine, является выражением интерполированной строки. Это похоже на шаблон, позволяющий создать одну строку (называемую результирующей строкой) из строки, содержащей внедренный код. Интерполированные строки особенно удобны при вставке значений в строку или сцеплении (объединении) строк.
Этот простой пример содержит два элемента, обязательные для каждой интерполированной строки:
Одно или несколько интерполированных выражений. Интерполированное выражение обозначено открывающей и закрывающей фигурной скобкой ( < и >). Вы можете указать внутри фигурных скобок любое выражение C#, возвращающее значение (включая null ).
Давайте рассмотрим еще несколько примеров интерполяции строк с другими типами данных.
Включение разных типов данных
В предыдущем разделе вы использовали интерполяцию строк для вставки одной строки внутрь другой. При этом интерполированное выражение может относиться к любому типу данных. Давайте включим в интерполированную строку значения разных типов данных.
Обратите внимание на то, что интерполированное выражение item в интерполированной строке разрешается в текст eggplant в результирующей строке. Связано это с тем, что если результат выражения не имеет строковый тип, он разрешается в строку описанным ниже образом.
В выходных данных этого примера дата является слишком точной (цена на баклажаны не меняется каждую секунду), а в значении цены не указана единица валюты. В следующем разделе вы узнаете, как устранить эти проблемы, управляя форматом строковых представлений результатов выражений.
Управление форматированием интерполированных выражений
В предыдущем разделе мы вставили две неправильно отформатированные строки в результирующую строку. Первая была значением даты и времени, при этом допустимой была только дата. Вторая была ценой, в которой отсутствовала единица валюты. Обе эти проблемы легко решить. Интерполяция строк позволяет указывать строки формата, управляющие форматированием определенных типов. Измените вызов Console.WriteLine из предыдущего примера, включив в него строки формата для выражений даты и цены, как показано в следующей строке:
Задайте строку формата, указав ее после интерполированного выражения через двоеточие. «d» — это стандартная строка формата для даты и времени, представляющая краткий формат. «C2» — это стандартная строка числового формата, представляющая число в виде денежной единицы с точностью два знака после запятой.
Попробуйте изменить строки формата в текстовом редакторе, возвращаясь в программу после каждого изменения, чтобы узнать, как они влияют на форматирование даты и времени, а также числового значения. Измените «d» в
Кроме форматирования, вы можете управлять шириной поля и выравниванием для форматированных строк, включаемых в результирующую строку. В следующем разделе вы научитесь это делать.
Управление шириной поля и выравниванием для интерполированных выражений
Как правило, когда результат интерполированного выражения форматируется как строка, она включается в результирующую строку без начальных или конечных пробелов. Особенно когда вы работаете с набором данных, возможность управления шириной поля и выравниванием помогает получить более понятные выходные данные. Чтобы увидеть это, замените весь код в текстовом редакторе следующим кодом, а затем введите dotnet run для выполнения программы:
Имена авторов выровнены по левому краю, а названия их произведений — по правому. Вы можете указать выравнивание, добавив запятую (,) после интерполированного выражения и назначив минимальную ширину поля. Если указанное значение является положительным числом, то поле выравнивается по правому краю. Если оно является отрицательным числом, то поле выравнивается по левому краю.
Попробуйте удалить знаки «минус» из кода <"Author",-25>и
На этот раз сведения об авторе выровнены по правому краю.
Выходные данные выглядят следующим образом:
Вы завершили работу с руководством по интерполяции строк.
Дополнительные сведения об интерполяции строк см. в разделе Интерполяция строк и в руководстве Интерполяция строк в C#.
$ — интерполяция строк (справочные материалы по C#)
Интерполяция строк предоставляет легко читаемый и удобный синтаксис для форматирования строк. Его проще читать, чем составное форматирование строк. Сравните следующий пример, в котором используются обе эти возможности для получения одинаковых выходных данных:
Структура интерполированной строки
Структура элемента с выражением интерполяции выглядит следующим образом:
Элементы в квадратных скобках являются необязательными. Каждый из элементов описан в таблице ниже:
Элемент | Описание |
---|---|
interpolationExpression | Выражение, создающее форматируемый результат. Строковое представление null является String.Empty. |
alignment | Константное выражение, значение которого определяет минимальное количество символов в строковом представлении результата выражения. Если оно положительное, строковое представление выравнивается по правому краю, если отрицательное — по левому краю. Дополнительные сведения см. в разделе Компонент выравнивания. |
formatString | Строка форматирования, поддерживаемая типом результата выражения. Дополнительные сведения см. в разделе Компонент строки форматирования. |
В следующем примере используются необязательные компоненты форматирования, описанные выше:
Начиная с C# 10, вы можете использовать интерполяцию строк для инициализации постоянной строки. Все выражения, используемые для заполнителей, должны быть постоянными строками. Иными словами, все выражения интерполяции должны быть строками и константами времени компиляции.
Специальные символы
Чтобы включить в текст, создаваемый интерполированной строкой, фигурную скобку «<" или ">«, используйте две фигурные скобки — «<<" или ">>». Подробнее см. в разделе Экранирование фигурных скобок.
Так как двоеточие (:) имеет особое значение в элементе выражения интерполяции, чтобы использовать условный оператор в выражении интерполяции, заключите это выражение в круглые скобки.
В следующем примере показано добавление фигурной скобки в строку результатов. В нем также показано, как использовать условный оператор:
Неявные преобразования и указание реализации IFormatProvider
Существует три неявных преобразования из интерполированных строк.
Преобразование интерполированной строки в экземпляр String. Строка является результатом разрешения интерполированной строки. Все элементы выражений интерполяции заменяются правильно форматированными представлениями строк их результатов. Это преобразование использует CurrentCulture для форматирования результатов выражений.
Преобразование интерполированной строки в экземпляр FormattableString, представляющий строку составного формата, а также форматируемые результаты выражения. Это позволяет создавать несколько результирующих строк с содержимым для конкретного языка из одного экземпляра FormattableString. Для этого вызовите один из следующих методов:
Преобразование интерполированной строки в экземпляр IFormattable, который также позволяет создавать несколько результирующих строк с содержимым для конкретного языка из одного экземпляра IFormattable.
В следующем примере используется неявное преобразование в FormattableString для создания результирующих строк для конкретного языка:
Дополнительные ресурсы
Если у вас нет опыта работы с интерполяцией строк, ознакомьтесь с интерактивным учебником по интерполяции строк в C#. Вы можете также просмотреть другой учебник по интерполяции строк в C#. В этом учебнике показано, как использовать интерполированные строки для создания форматированных строк.
Продвинутая интерполяция строк в Swift 5.0
Интерполяция строк была в Swift с ранних версий, но в Swift 5.0 этот функционал был расширен, стал быстрее и значительно мощнее.
В этой статье мы пройдёмся по новым возможностям интерполяции строк и рассмотрим, как это можно применить в нашем собственном коде. Вы также можете загрузить исходники к этой статье здесь.
Основы
Мы используем базовую интерполяцию строк вот так:
Мы считаем это само собой разумеющимся, но в своё время это стало значительным облегчением по сравнению с тем, с чем приходилось иметь дело раньше:
Здесь также значимый выигрыш в производительности, так как альтернативой было:
Да, конечный результат был бы тем же, но Swift пришлось бы добавить s1 к s2 чтобы получить s5, добавить s5 к s3 чтобы получить s6, и добавить s6 к s4 чтобы получить s7, перед присвоением all.
Интерполяция строк практически не менялась со Swift 1.0, единственное значимое изменение пришло вместе с Swift 2.1, где мы получили возможность использовать в интерполяции string literals:
Как вы знаете, Swift развивается во многом благодаря предложениям сообщества. Идеи обсуждаются, разрабатываются — и либо принимаются, либо отвергаются.
Итак, спустя пять лет, развитие Swift добралось до интерполяции строк. В Swift 5.0 появились новые супервозможности, которые дают нам возможность контролировать процесс интерполяции строк.
Чтобы попробовать, рассмотрим следующий сценарий. Если мы задаём новую целую переменную вот так:
то совершенно очевидно, что мы можем использовать интерполяцию строк следующим образом:
Но что, если мы хотим отформатировать результат как-то по-другому?
Используя новую систему интерполяции строк в in Swift 5.0 мы можем написать экстеншн String.StringInterpolation, чтобы добавить свой собственный метод интерполяции:
Теперь код выведет целую переменную как текст: “Hi, I’m thirty-eight.”
Мы можем использовать похожую технику чтобы поправить форматирование даты, поскольку вид даты по умолчанию в виде string не слишком привлекателен:
Вы увидите, что Swift выведет текущую дату в виде что-то вроде: “2019-02-21 23:30:21 +0000”. Мы можем сделать это красивее используя своё собственное форматирование даты:
Теперь результат выглядит гораздо лучше, что-то вроде: “February 21, 2019 23:30:21”.
Замечание: чтобы избежать возможной путаницы при совместной работе в команде, вам, вероятно, не стоит перекрывать методы Swift по умолчанию. Поэтому дайте параметрам имена на свой выбор, чтобы избежать путаницы:
Теперь мы вызовем этот метод с именованным параметром:
Теперь будет ясно видно, что мы используем собственную реализацию метода.
Интерполяция с параметрами
Это изменение показывает, что теперь у нас есть полный контроль над тем, каким образом происходит интерполяция строк.
Например, мы можем переписать код, чтобы обрабатывать сообщения в Twitter:
Теперь мы можем написать так:
Но зачем нам ограничиваться одним параметром? Для нашего примера форматирования числа нет никакого смысла принуждать пользователей использовать один параметр конвертирования (.spellOut) — так что мы изменим метод, добавив второй параметр:
И используем его так:
У вас может быть сколько угодно параметров, любого типа. Пример с использованием @autoclosure для значения по умолчанию:
Применение атрибута @autoclosure означает, что для значения по умолчанию мы можем использовать простые значения или вызывать сложные функции. В методе они станут замыканием.
Теперь вы, возможно, полагаете, что мы можем переписать код без использования функционала интерполяции, что-то вроде этого:
Но теперь мы усложнили вызов — ведь мы же очевидно пытаемся отформатировать что-то, в этом и есть смысл интерполяции. Помните правило Swift — избегайте ненужных слов.
Erica Sadun предложила по-настоящему короткий и красивый пример того, как можно упростить код:
Добавление интерполяции строк для пользовательских типов
Мы можете использовать интерполяцию строк для своих собственных типов:
Интерполяция строк полезна тем, что мы не касаемся отладочной информации об объекте. Если мы посмотрим его в дебаггере или выведем его, то мы увидим нетронутые данные:
Мы можем комбинировать пользовательский тип с несколькими параметрами:
Конечно же, вы можете использовать все возможности Swift, чтобы создать своё собственное форматирование. Например, мы можем написать реализацию, которая принимает любой объект Encodable и выводит его в JSON:
Если мы сделаем Person соответствующим протоколу Encodable, то мы можем сделать так:
Вы можете использовать возможности вроде переменного числа параметров иди даже пометить вашу реализацию интерполяции как throwing. Например, наша система форматирования JSON в случае ошибки кодирования никак не реагирует, но мы может это исправить для анализа произошедшей ошибки в дальнейшем:
Всё, что мы до сих пор рассматривали — это просто модификации способов интерполяции строк.
Создание собственных типов при помощи интерполяции
Как вы видели, речь шла о способе форматирования данных в вашем приложении по-настоящему удобным способом, но мы также можем создавать свои собственные типы используя интерполяцию строк.
Чтобы продемонстрировать это, мы создадим новый тип, который инициализируется из string при помощи интерполяции строк.
На самом деле, под капотом тут один синтаксический сахар. Заключительную часть мы вполне могли бы написать вручную:
Заключение
Как вы видели, пользовательская интерполяция строк позволяет нам разместить форматирование в одном месте, так что вызовы методов становятся проще и яснее. Также это предоставляет нам отличную гибкость для создания требуемых типов максимально естественным образом.
Помните, что это только одна из возможностей — и не единственная. Это означает, что иногда мы используем интерполяцию, иногда функции или что-то ещё. Как и многое в разработке, всегда нужно выбирать оптимальный способ решения задачи.