Строки с интерполяцией (Visual Basic ссылка)Interpolated Strings (Visual Basic Reference)

Используется для создания строк.Used to construct strings. Интерполированное строковое выражение выглядит как строка шаблона, которая содержит интерполированные выражения.An interpolated string looks like a template string that contains interpolated expressions. Интерполированная строка возвращает строку, которая заменяет содержащиеся в ней интерполированные выражения строковыми представлениями.An interpolated string returns a string that replaces the interpolated expressions that it contains with their string representations. Эта функция доступна в Visual Basic 14 и более поздних версий.This feature is available in Visual Basic 14 and later versions.

Аргументы интерполированной строки понять проще, чем строку составного формата.The arguments of an interpolated string are easier to understand than a composite format string. Например, интерполированная строкаFor example, the interpolated string

Console.WriteLine($"Name = {name}, hours = {hours:hh}")

содержит два интерполированных выражения "{name}" и "{hours:hh}".contains two interpolated expressions, '{name}' and '{hours:hh}'. Эквивалентная строка составного формата имеет следующий вид:The equivalent composite format string is:

Console.WriteLine("Name = {0}, hours = {1:hh}", name, hours);

Структура интерполированной строки выглядит следующим образом:The structure of an interpolated string is:

$"<text> {<interpolated-expression> [,<field-width>] [:<format-string>] } <text> ..."

где:where:

  • field-width — это целое число со знаком, указывающее количество символов в поле.field-width is a signed integer that indicates the number of characters in the field. Если оно является положительным, поле выравнивается по правому краю, если оно отрицательное — по левому краю.If it is positive, the field is right-aligned; if negative, left-aligned.

  • format-string — это строка формата, соответствующая типу форматируемого объекта.format-string is a format string appropriate for the type of object being formatted. Например, для DateTime значения может использоваться строка стандартного формата даты и времени , например "d" или "d".For example, for a DateTime value, it could be a standard date and time format string such as "D" or "d".

Важно!

Между $ и " в начале строки не может быть пробела.You cannot have any white space between the $ and the " that starts the string. Это приводит к ошибке компилятора.Doing so causes a compiler error.

Интерполированную строку можно использовать везде, где допустимо применять строковый литерал.You can use an interpolated string anywhere you can use a string literal. Интерполированная строка вычисляется каждый раз, когда выполняется код с интерполированной строкой.The interpolated string is evaluated each time the code with the interpolated string executes. Это позволяет разделить определение и вычисление интерполированной строки.This allows you to separate the definition and evaluation of an interpolated string.

Чтобы включить в интерполированную строку фигурные скобки ("{" или "}"), используйте две фигурные скобки — "{{" или "}}".To include a curly brace ("{" or "}") in an interpolated string, use two curly braces, "{{" or "}}". Дополнительные сведения см в разделе «Неявные преобразования».See the Implicit Conversions section for more details.

Если интерполированная строка содержит другие символы со специальным значением в интерполированной строке, например, знак кавычки ("), двоеточие (:) или запятая (,), их необходимо экранировать, если они встречаются в обычном тексте, или они должны быть включены в выражение, разделенное круглыми скобками, если они являются языковыми элементами, включенными в интерполированное выражение.If the interpolated string contains other characters with special meaning in an interpolated string, such as the quotation mark ("), colon (:), or comma (,), they should be escaped if they occur in literal text, or they should be included in an expression delimited by parentheses if they are language elements included in an interpolated expression. В следующем примере показано экранирование кавычек, чтобы включить их в результирующую строку, и использование скобок для разделения выражения (age == 1 ? "" : "s"), чтобы двоеточие не интерпретировалось как начало строки формата.The following example escapes quotation marks to include them in the result string, and it uses parentheses to delimit the expression (age == 1 ? "" : "s") so that the colon is not interpreted as beginning a format string.

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.
' </Snippet1>

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

Существует три преобразования неявных типов из интерполированных строк.There are three implicit type conversions from an interpolated string:

  1. Преобразование интерполированной строки в String.Conversion of an interpolated string to a String. В следующем примере возвращается строка, интерполированные строковые выражения которой были заменены их строковыми представлениями.The following example returns a string whose interpolated string expressions have been replaced with their string representations. Например:For example:

    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>
    

    Это окончательный результат интерпретации строк.This is the final result of a string interpretation. Все вхождения двойных фигурных скобок ("{{" и "}}") преобразуются в одиночную фигурную скобку.All occurrences of double curly braces ("{{" and "}}") are converted to a single curly brace.

  2. Преобразование интерполированной строки в переменную IFormattable, которая позволяет создавать несколько результирующих строк с содержимым для конкретного языка из одного экземпляра IFormattable.Conversion of an interpolated string to an IFormattable variable that allows you create multiple result strings with culture-specific content from a single IFormattable instance. Это полезно для включения правильных форматов чисел и дат для отдельных языков.This is useful for including such things as the correct numeric and date formats for individual cultures. Все вхождения двойных фигурных скобок ("{{" и "}}") остаются двойными фигурными скобками до тех пор, пока строка не будет отформатирована путем явного или неявного вызова метода ToString().All occurrences of double curly braces ("{{" and "}}") remain as double curly braces until you format the string by explicitly or implicitly calling the ToString() method. Все содержащиеся в них выражения интерполяции {0}преобразуются в, {1}и т. д.All contained interpolation expressions are converted to {0}, {1}, and so on.

    В следующем примере используется отражение для отображения членов, а также значений поля и свойства переменной IFormattable, созданной из интерполированной строки.The following example uses reflection to display the members as well as the field and property values of an IFormattable variable that is created from an interpolated string. Кроме того, переменная IFormattable передается в метод Console.WriteLine(String).It also passes the IFormattable variable to the Console.WriteLine(String) method.

    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>
    
    

    Обратите внимание, что интерполированную строку можно проверить только с помощью отражения.Note that the interpolated string can be inspected only by using reflection. Если она передается методу форматирования строк, например WriteLine(String), элементы формата разрешаются и возвращается результирующая строка.If it is passed to a string formatting method, such as WriteLine(String), its format items are resolved and the result string returned.

  3. Преобразование строки с интерполяцией в FormattableString переменную, представляющую строку составного формата.Conversion of an interpolated string to a FormattableString variable that represents a composite format string. Проверка строки составного формата и способа ее отрисовки в виде результирующей строки может, например, обеспечивать защиту от атак путем внедрения кода, если выполнялось построение запроса.Inspecting the composite format string and how it renders as a result string might, for example, help you protect against an injection attack if you were building a query. А FormattableString также включает в себя:A FormattableString also includes:

    Все вхождения двойных фигурных скобок ("{{" и "}}") остаются в виде двойных фигурных скобок до тех пор, пока не будет выполнено форматирование.All occurrences of double curly braces ("{{" and "}}") remain as double curly braces until you format. Все содержащиеся в них выражения интерполяции {0}преобразуются в, {1}и т. д.All contained interpolation expressions are converted to {0}, {1}, and so on.

    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!
    
    

См. такжеSee also