Ciągi interpolowane (odwołanie Visual Basic)Interpolated Strings (Visual Basic Reference)

Używane do konstruowania ciągów.Used to construct strings. Ciąg interpolowany wygląda jak ciąg szablonu, który zawiera interpolowane wyrażenia.An interpolated string looks like a template string that contains interpolated expressions. Ciąg interpolowany zwraca ciąg, który zastępuje interpolowane wyrażenia, które zawiera z ich reprezentacją ciągu.An interpolated string returns a string that replaces the interpolated expressions that it contains with their string representations. Ta funkcja jest dostępna w wersji Visual Basic 14 i nowszych.This feature is available in Visual Basic 14 and later versions.

Argumenty interpolowanego ciągu są łatwiejsze do zrozumienia niż ciąg formatu złożonego.The arguments of an interpolated string are easier to understand than a composite format string. Na przykład ciąg interpolowanyFor example, the interpolated string

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

zawiera dwa wyrażenia interpolowane "{name}" i "{hours: gg}".contains two interpolated expressions, '{name}' and '{hours:hh}'. Równoważny ciąg formatu złożonego to:The equivalent composite format string is:

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

Struktura ciągu interpolowanego jest:The structure of an interpolated string is:

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

gdzie:where:

  • pole-Width jest ze znakiem liczby całkowitej, która wskazuje liczbę znaków w polu.field-width is a signed integer that indicates the number of characters in the field. Jeśli wartość jest dodatnia, pole jest wyrównane do prawej; w przypadku wartości ujemnych wyrównanych do lewej.If it is positive, the field is right-aligned; if negative, left-aligned.

  • ciąg formatu jest ciągiem formatu odpowiednim dla typu formatowanego obiektu.format-string is a format string appropriate for the type of object being formatted. Na przykład w przypadku wartości DateTime może to być standardowy ciąg formatu daty i godziny , taki jak "d" lub "d".For example, for a DateTime value, it could be a standard date and time format string such as "D" or "d".

Ważne

Między $ i ", które zaczynają ciąg, nie mogą występować żadne odstępy.You cannot have any white space between the $ and the " that starts the string. Powoduje to błąd kompilatora.Doing so causes a compiler error.

Możesz użyć ciągu interpolowanego wszędzie tam, gdzie można użyć literału ciągu.You can use an interpolated string anywhere you can use a string literal. Ciąg interpolowany jest oceniany za każdym razem, gdy wykonywany jest kod z ciągiem interpolowanym.The interpolated string is evaluated each time the code with the interpolated string executes. Pozwala to na oddzielenie definicji i oceny ciągu interpolowanego.This allows you to separate the definition and evaluation of an interpolated string.

Aby dołączyć nawias klamrowy ("{" lub "}") w ciągu interpolowanym, użyj dwóch nawiasów klamrowych "{{" lub "}}".To include a curly brace ("{" or "}") in an interpolated string, use two curly braces, "{{" or "}}". Aby uzyskać więcej informacji, zobacz sekcję konwersje niejawne.See the Implicit Conversions section for more details.

Jeśli ciąg interpolowany zawiera inne znaki o specjalnym znaczeniu w ciągu interpolowanym, takim jak cudzysłów ("), dwukropek (:) lub przecinek (,), powinny być wyprowadzane w przypadku wystąpienia tekstu w postaci literału lub powinny być zawarte w wyrażeniu ograniczonym przez nawiasy, jeśli są elementami języka zawartymi w wyrażeniu interpolowanym.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. Poniższy przykład wyprowadza znaki cudzysłowu, aby uwzględnić je w ciągu wynikowym, i używa nawiasów, aby rozdzielić wyrażenie (age == 1 ? "" : "s") tak, aby dwukropek nie był interpretowany jako początkowy ciąg formatu.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>

Niejawne konwersjeImplicit Conversions

Istnieją trzy niejawne konwersje typów z ciągu interpolowanego:There are three implicit type conversions from an interpolated string:

  1. Konwersja ciągu interpolowanego na String.Conversion of an interpolated string to a String. Poniższy przykład zwraca ciąg, którego interpolowane wyrażenia ciągu zostały zastąpione ich reprezentacją ciągu.The following example returns a string whose interpolated string expressions have been replaced with their string representations. Na przykład: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>
    

    Jest to ostateczny wynik interpretacji ciągu.This is the final result of a string interpretation. Wszystkie wystąpienia podwójnych nawiasów klamrowych ("{{" i "}}") są konwertowane na pojedynczy nawias klamrowy.All occurrences of double curly braces ("{{" and "}}") are converted to a single curly brace.

  2. Konwersja ciągu interpolowanego na zmienną IFormattable, która umożliwia tworzenie wielu ciągów wynikowych przy użyciu zawartości specyficznej dla kultury z jednego wystąpienia 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. Jest to przydatne do uwzględniania takich elementów jak poprawne formaty liczbowe i daty dla poszczególnych kultur.This is useful for including such things as the correct numeric and date formats for individual cultures. Wszystkie wystąpienia podwójnych nawiasów klamrowych ("{{" i "}}") pozostają jako podwójne nawiasy klamrowe do momentu formatowania ciągu przez jawne lub niejawne wywołanie metody 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. Wszystkie zawarte wyrażenia interpolacji są konwertowane na {0}, {1}i tak dalej.All contained interpolation expressions are converted to {0}, {1}, and so on.

    Poniższy przykład używa odbicia, aby wyświetlić elementy członkowskie, a także wartości pól i właściwości zmiennej IFormattable, która jest tworzona na podstawie interpolowanego ciągu.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. Przekazuje również zmienną IFormattable do metody 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>
    
    

    Należy zauważyć, że ciąg interpolowany może być sprawdzany tylko przy użyciu odbicia.Note that the interpolated string can be inspected only by using reflection. Jeśli zostanie przekazana do metody formatowania ciągu, takiej jak WriteLine(String), jego elementy formatu są rozwiązane i zwracany ciąg wynikowy.If it is passed to a string formatting method, such as WriteLine(String), its format items are resolved and the result string returned.

  3. Konwersja ciągu interpolowanego na zmienną FormattableString, która reprezentuje ciąg formatu złożonego.Conversion of an interpolated string to a FormattableString variable that represents a composite format string. Sprawdzanie ciągu formatu złożonego i sposób renderowania jako ciąg wynikowy może na przykład ułatwić ochronę przed atakami polegającymi na iniekcji w przypadku tworzenia zapytania.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 obejmuje również:A FormattableString also includes:

    Wszystkie wystąpienia podwójnych nawiasów klamrowych ("{{" i "}}") pozostają jako podwójne nawiasy klamrowe, dopóki nie sformatujesz.All occurrences of double curly braces ("{{" and "}}") remain as double curly braces until you format. Wszystkie zawarte wyrażenia interpolacji są konwertowane na {0}, {1}i tak dalej.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!
    
    

Zobacz takżeSee also