Udostępnij za pośrednictwem


Ciągi interpolowane (odwołanie do Języka Visual Basic)

Służy do konstruowania ciągów znaków. Ciąg interpolowany wygląda jak ciąg szablonu zawierający wyrażenia interpolowane. Ciąg interpolowany zwraca ciąg, który zastępuje wyrażenia interpolowane, które zawiera ich reprezentacje ciągów. Ta funkcja jest dostępna w visual basic 14 i nowszych wersjach.

Argumenty ciągu interpolowanego są łatwiejsze do zrozumienia niż ciąg formatu złożonego. Na przykład następujący ciąg interpolowany zawiera dwa wyrażenia interpolowane i {name}{hours:hh}:

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

Równoważny ciąg formatu złożonego to:

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

Struktura ciągu interpolowanego to:

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

Gdzie:

  • field-width jest liczbą całkowitą ze znakiem wskazującą liczbę znaków w polu. Jeśli jest to dodatnie, pole jest wyrównane do prawej; jeśli ujemne, wyrównane do lewej.

  • format-string to ciąg formatu odpowiedni dla typu sformatowanego obiektu. Na przykład dla DateTime wartości może to być standardowy ciąg formatu daty i godziny , taki jak "D" lub "d".

Ważne

Nie można mieć żadnego odstępu między znakiem $ a ", który rozpoczyna ciąg. Spowoduje to błąd kompilatora.

Możesz użyć ciągu interpolowanego w dowolnym miejscu, w którym można użyć zwykłego tekstu. Ciąg interpolowany jest obliczany za każdym razem, gdy kod z ciągiem interpolowanym jest wykonywany. Dzięki temu można oddzielić definicję i ocenę ciągu interpolowanego.

Aby uwzględnić nawias klamrowy ("{" lub "}") w ciągu interpolowanym, użyj dwóch nawiasów klamrowych, "{{" lub "}}". Aby uzyskać więcej informacji, zobacz Niejawne konwersje.

Jeśli ciąg interpolowany zawiera inne znaki ze specjalnym znaczeniem w ciągu interpolowanym, takim jak cudzysłów ("), dwukropek (:) lub przecinek (,), powinny one zostać uniknione, jeśli wystąpią w tekście literału. Lub jeśli są elementami języka zawartymi w wyrażeniu interpolowanym, powinny one być uwzględniane w wyrażeniu rozdzielonym nawiasami. Poniższy przykład umożliwia ucieczkę cudzysłowów w celu uwzględnienia ich w ciągu wynikowym:

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.

Niejawne przekształcenia

Istnieją trzy niejawne konwersje typów z ciągu interpolowanego:

  1. Konwersja ciągu interpolowanego na String. Poniższy przykład zwraca łańcuch znaków, w którym wyrażenia interpolacyjne zostały zastąpione ich odpowiednimi reprezentacjami. Przykład:

    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 końcowy wynik interpretacji ciągu. Wszystkie wystąpienia podwójnych nawiasów klamrowych ("{{" i "}}") są konwertowane na pojedynczy nawias klamrowy.

  2. Konwersja ciągu interpolowanego na zmienną IFormattable , która umożliwia tworzenie wielu ciągów wyników z zawartością specyficzną dla kultury z jednego IFormattable wystąpienia. Jest to przydatne w przypadku dołączania takich elementów jak poprawne formaty liczbowe i daty dla poszczególnych kultur. Wszystkie wystąpienia podwójnych nawiasów klamrowych ("{{" i "}}") pozostają jako podwójne nawiasy klamrowe, dopóki ciąg nie zostanie sformatowany jawnie lub niejawnie wywołując metodę ToString() . Wszystkie zawarte wyrażenia interpolacji są konwertowane na {0}, {1}i tak dalej.

    W poniższym przykładzie użyto odbicia, aby wyświetlić elementy członkowskie, a także wartości IFormattable pól i właściwości zmiennej utworzonej na podstawie ciągu interpolowanego. Przekazuje również zmienną IFormattable do metody 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>
    
    

    Należy pamiętać, że ciąg interpolowany można sprawdzić tylko przy użyciu odbicia. Jeśli zostanie przekazana do metody formatowania ciągów, takiej jak WriteLine(String), jej elementy formatu zostaną rozpoznane i zwrócony ciąg wynikowy.

  3. Konwersja ciągu interpolowanego na zmienną FormattableString reprezentującą ciąg formatu złożonego. Inspekcja ciągu formatu złożonego i sposobu, w jaki jest renderowany jako ciąg wynikowy, może na przykład pomóc w ochronie przed atakiem typu injection, jeśli konstruujesz zapytanie. Również obejmuje FormattableString:

    Wszystkie wystąpienia podwójnych nawiasów klamrowych ("{{" i "}}") pozostają jako podwójne nawiasy klamrowe do momentu sformatowania. Wszystkie zawarte wyrażenia interpolacji są konwertowane na {0}, {1}i tak dalej.

    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że