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

Służy do konstruowania ciągó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 ciąg interpolowany

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

Zawiera dwa wyrażenia interpolowane, "{name}" i "{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 to liczba całkowita ze znakiem wskazująca liczbę znaków w polu. Jeśli pole jest dodatnie, 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 $ i " , który uruchamia ciąg. Spowoduje to błąd kompilatora.

Możesz użyć ciągu interpolowanego w dowolnym miejscu, w którym można użyć literału ciągu. 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 sekcję 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ć pominięte, jeśli wystąpią w tekście literału lub powinny zostać uwzględnione w wyrażeniu rozdzielonym nawiasami, jeśli są elementami języka zawartymi w wyrażeniu interpolowanym. 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.

Konwersje niejawne

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

  1. Konwersja ciągu interpolowanego na String. Poniższy przykład zwraca ciąg, którego wyrażenia ciągów interpolowanych zostały zastąpione ich reprezentacjami ciągów. Na 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 pól i właściwości zmiennej IFormattable utworzonej na podstawie ciągu interpolowanego. Przekazuje również zmienną IFormattableConsole.WriteLine(String) do metody .

    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 jest przekazywany do metody formatowania ciągów, takiej jak WriteLine(String), jego elementy formatu są rozpoznawane i zwracany 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 renderowania go jako ciągu wynikowego może na przykład pomóc w ochronie przed atakiem polegającym na wstrzyknięciu, jeśli tworzysz zapytanie. Obejmuje FormattableString również:

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