Поделиться через


Интерполированные строки (справочник по Visual Basic)

Используется для создания строк. Интерполированная строка выглядит как строка шаблона, содержащая интерполированные выражения. Интерполированная строка возвращает строку, которая заменяет интерполированные выражения, содержащиеся в ней, их строковыми представлениями. Эта функция доступна в Visual Basic 14 и более поздних версиях.

Аргументы интерполированной строки проще понять, чем составную строку форматирования. Например, следующая интерполированная строка содержит два интерполированных выражения и {name}{hours:hh}:

Console.WriteLine($"Name = {name}, hours = {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!
    
    

См. также