Интерполированные строки (справочник по 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.

Неявные преобразования

Существует три преобразования неявных типов из интерполированных строк.

  1. Преобразование интерполированной строки в 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>
    

    Это окончательный результат интерпретации строк. Все вхождения двойных фигурных скобок ("{{" и "}}") преобразуются в одиночную фигурную скобку.

  2. Преобразование интерполированной строки в переменную 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), элементы формата разрешаются и возвращается результирующая строка.

  3. Преобразование интерполированной строки в 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!
    
    

См. также