Интерполированные строки (справочник по Visual Basic)
Используется для создания строк. Интерполированное строковое выражение выглядит как строка шаблона, которая содержит интерполированные выражения. Интерполированная строка возвращает строку, которая заменяет содержащиеся в ней интерполированные выражения строковыми представлениями. Эта функция доступна в Visual Basic 14 и более поздних версиях.
Аргументы интерполированной строки понять проще, чем строку составного формата. Например, интерполированная строка
Console.WriteLine($"Name = {name}, hours = {hours:hh}")
содержит два интерполированных выражения "{name}" и "{hours:hh}". Эквивалентная строка составного формата имеет следующий вид:
Console.WriteLine("Name = {0}, hours = {1:hh}", name, hours)
Структура интерполированной строки выглядит следующим образом:
$"<text> {<interpolated-expression> [,<field-width>] [:<format-string>] } <text> ..."
где:
field-width — это целое число со знаком, указывающее количество символов в поле. Если оно является положительным, поле выравнивается по правому краю, если оно отрицательное — по левому краю.
format-string — это строка формата, соответствующая типу форматируемого объекта. Например, для DateTime значения это может быть стандартная строка формата даты и времени, например "D" или "d".
Внимание
Между $
и "
в начале строки не может быть пробела. Это приводит к ошибке компилятора.
Интерполированную строку можно использовать везде, где допустимо применять строковый литерал. Интерполированная строка вычисляется каждый раз, когда выполняется код с интерполированной строкой. Это позволяет разделить определение и вычисление интерполированной строки.
Чтобы включить в интерполированную строку фигурные скобки ("{" или "}"), используйте две фигурные скобки — "{{" или "}}". Дополнительные сведения см в разделе Неявные преобразования.
Если интерполированная строка содержит другие символы со специальным значением в интерполированной строке, например, знак кавычки ("), двоеточие (:) или запятая (,), их необходимо экранировать, если они встречаются в обычном тексте, или они должны быть включены в выражение, разделенное круглыми скобками, если они являются языковыми элементами, включенными в интерполированное выражение. Следующий пример экранирует кавычки, чтобы включить их в результируемую строку:
Public Module Example
Public Sub Main()
Dim name = "Horace"
Dim age = 34
Dim s1 = $"He asked, ""Is your name {name}?"", but didn't wait for a reply."
Console.WriteLine(s1)
Dim s2 = $"{name} is {age:D3} year{If(age = 1, "", "s")} old."
Console.WriteLine(s2)
End Sub
End Module
' The example displays the following output:
' He asked, "Is your name Horace?", but didn't wait for a reply.
' Horace is 034 years old.
Неявные преобразования
Существует три преобразования неявных типов из интерполированных строк.
Преобразование интерполированной строки в String. В следующем примере возвращается строка, интерполированные строковые выражения которой были заменены их строковыми представлениями. Например:
Public Module Example Public Sub Main() Dim name = "Bartholomew" Dim s1 = $"Hello, {name}!" Console.WriteLine(s1) End Sub End Module ' The example displays the following output: ' Hello, Bartholomew! ' </Snippet1>
Это окончательный результат интерпретации строк. Все вхождения двойных фигурных скобок ("{{" и "}}") преобразуются в одиночную фигурную скобку.
Преобразование интерполированной строки в переменную IFormattable, которая позволяет создавать несколько результирующих строк с содержимым для конкретного языка из одного экземпляра IFormattable. Это полезно для включения правильных форматов чисел и дат для отдельных языков. Все вхождения двойных фигурных скобок ("{{" и "}}") остаются двойными фигурными скобками до тех пор, пока строка не будет отформатирована путем явного или неявного вызова метода ToString(). Все содержащиеся выражения интерполяции преобразуются {0}в , {1}и т. д.
В следующем примере используется отражение для отображения членов, а также значений поля и свойства переменной IFormattable, созданной из интерполированной строки. Кроме того, переменная IFormattable передается в метод Console.WriteLine(String).
Imports System.Globalization Imports System.Reflection Public Module Example Public Sub Main() Dim price = 1000 Dim s2 As IFormattable = $"The cost of this item is {price:C}." ShowInfo(s2) CultureInfo.CurrentCulture = New CultureInfo("en-US") Console.WriteLine(s2) CultureInfo.CurrentCulture = New CultureInfo("fr-FR") Console.WriteLine(s2) End Sub Private Sub ShowInfo(obj As Object) Console.WriteLine($"Displaying member information:{vbCrLf}") Dim t = obj.GetType() Dim flags = BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.Static Or BindingFlags.NonPublic For Each m In t.GetMembers(flags) Console.Write($" {m.Name} {m.MemberType}") If m.MemberType = MemberTypes.Property Then Dim p = t.GetProperty(m.Name, flags) Console.Write($" Value: {p.GetValue(obj)}") End If If m.MemberType = MemberTypes.Field Then Dim f = t.GetField(m.Name, flags) Console.Write($" Value: {f.GetValue(obj)}") End If Console.WriteLine() Next Console.WriteLine($"-------{vbCrLf}") End Sub End Module ' The example displays the following output: Displaying member information: ' get_Format Method ' GetArguments Method ' get_ArgumentCount Method ' GetArgument Method ' ToString Method ' System.IFormattable.ToString Method ' ToString Method ' Equals Method ' GetHashCode Method ' GetType Method ' Finalize Method ' MemberwiseClone Method ' .ctor Constructor ' Format Property Value: The cost of this item is {0:C}. ' ArgumentCount Property Value: 1 ' _format Field Value: The cost of this item is {0:C}. ' _arguments Field Value: System.Object[] ' ------- ' ' The cost of this item is $1,000.00. ' The cost of this item is 1 000,00 €. ' </Snippet1>
Обратите внимание, что интерполированную строку можно проверить только с помощью отражения. Если она передается методу форматирования строк, например WriteLine(String), элементы формата разрешаются и возвращается результирующая строка.
Преобразование интерполированной строки в FormattableString переменную, представляющую составную строку формата. Проверка строки составного формата и способа ее отрисовки в виде результирующей строки может, например, обеспечивать защиту от атак путем внедрения кода, если выполнялось построение запроса. Также FormattableString включается:
Перегрузка ToString(), которая формирует результирующую строку для CurrentCulture.
Метод Invariant , который создает строку для InvariantCulture.
Метод ToString(IFormatProvider), который формирует результирующую строку для указанного языка и региональных параметров.
Все вхождения двойных фигурных фигурных скобок ("{" и "}}") остаются как двойные фигурные скобки до тех пор, пока не будете форматировать. Все содержащиеся выражения интерполяции преобразуются {0}в , {1}и т. д.
Imports System.Globalization Public Module Example Public Sub Main() Dim name = "Bartholomew" Dim s3 As FormattableString = $"Hello, {name}!" Console.WriteLine($"String: '{s3.Format}'") Console.WriteLine($"Arguments: {s3.ArgumentCount}") Console.WriteLine($"Result string: {s3}") End Sub End Module ' The example displays the following output: ' String: 'Hello, {0}!' ' Arguments: 1 ' Result string: Hello, Bartholomew!