Interpolované řetězce (referenční dokumentace jazyka Visual Basic)

Slouží k vytváření řetězců. Interpolovaný řetězec vypadá jako řetězec šablony, který obsahuje interpolované výrazy. Interpolovaný řetězec vrátí řetězec, který nahradí interpolované výrazy, které obsahuje řetězcovými reprezentacemi. Tato funkce je dostupná ve Visual Basicu 14 a novějších verzích.

Argumenty interpolovaného řetězce jsou srozumitelnější než složený formátovací řetězec. Například interpolovaný řetězec

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

obsahuje dva interpolované výrazy{ name} a {hours:hh}. Ekvivalentní řetězec složeného formátu je:

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

Struktura interpolovaného řetězce je:

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

kde:

  • šířka pole je celé číslo se znaménkem, které označuje počet znaků v poli. Pokud je kladné, pole je zarovnané doprava; pokud je záporná, zarovnaná doleva.

  • format-string je formátovací řetězec vhodný pro typ objektu, který je formátován. Například pro DateTime hodnotu může být standardní řetězec formátu data a času, například "D" nebo "d".

Důležité

Mezi řetězcem a " řetězcem, který spouští, nemůžete mít žádné prázdné znaky$. Tím dojde k chybě kompilátoru.

Interpolovaný řetězec můžete použít kdekoli, kde můžete použít řetězcový literál. Interpolovaný řetězec se vyhodnotí při každém spuštění kódu s interpolovaným řetězcem. To vám umožní oddělit definici a vyhodnocení interpolovaného řetězce.

Chcete-li do interpolovaného řetězce zahrnout složenou závorku ({nebo "}"), použijte dvě složené závorky{ nebo "}}". Další podrobnosti najdete v části Implicitní převody.

Pokud interpolovaný řetězec obsahuje jiné znaky se zvláštním významem v interpolovaném řetězci, například uvozovky ("), dvojtečku (:) nebo čárku (,), měly by být uvozené, pokud se vyskytují v literálovém textu, nebo by měly být zahrnuty do výrazu odděleného závorkou, pokud jsou prvky jazyka zahrnuté do interpolovaného výrazu. Následující příklad uvozovky vloží do výsledného řetězce:

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.

Implicitní převody

Existují tři implicitní převody typu z interpolovaného řetězce:

  1. Převod interpolovaného řetězce na String. Následující příklad vrátí řetězec, jehož interpolované řetězcové výrazy byly nahrazeny jejich řetězcové reprezentace. Příklad:

    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>
    

    Toto je konečný výsledek interpretace řetězce. Všechny výskyty dvojitých složených závorek ({{" a "}}") se převedou na jednu složenou složenou závorku.

  2. Převod interpolovaného řetězce na proměnnou IFormattable , která umožňuje vytvořit více výsledných řetězců s obsahem specifickým pro jazykovou verzi z jedné IFormattable instance. To je užitečné pro zahrnutí takových věcí, jako jsou správné číselné formáty a formáty kalendářních dat pro jednotlivé jazykové verze. Všechny výskyty dvojitých složených závorek ("{{" a "}}") zůstanou ve formátu dvojitých složených závorek, dokud řetězec nenaformátujete explicitním nebo implicitním voláním ToString() metody. Všechny obsažené interpolační výrazy se převedou na {0}atd {1}.

    Následující příklad používá reflexi k zobrazení členů a také pole a hodnoty IFormattable vlastností proměnné, která je vytvořena z interpolovaného řetězce. Také předá proměnnou IFormattableConsole.WriteLine(String) metodě.

    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>
    
    

    Všimněte si, že interpolovaný řetězec lze zkontrolovat pouze pomocí reflexe. Pokud je předán do metody formátování řetězce, například WriteLine(String), jeho formát položky jsou vyřešeny a výsledný řetězec vrácen.

  3. Převod interpolovaného řetězce na proměnnou FormattableString , která představuje složený formátovací řetězec. Kontrola složeného řetězce formátu a jeho vykreslení jako výsledného řetězce může například pomoct chránit před útokem prostřednictvím injektáže, pokud vytváříte dotaz. A FormattableString také zahrnuje:

    Všechny výskyty dvojitých složených složených závorek ({{{ a "}}") zůstanou ve formátu dvojitých složených závorek. Všechny obsažené interpolační výrazy se převedou na {0}atd {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!
    
    

Viz také