Sdílet prostřednictvím


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, jež obsahuje, jejich řetězcovými hodnotami. 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 následující interpolovaný řetězec obsahuje dva interpolované výrazy: {name} a {hours:hh}.

Console.WriteLine($"Name = {name}, hours = {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:

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

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

Důležité

Mezi $ a ", které začínají řetězec, 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ší informace naleznete v tématu 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 escapovány, pokud se objeví v doslovném textu. Nebo pokud jsou prvky jazyka zahrnuté do interpolovaného výrazu, měly by být zahrnuty do výrazu odděleného závorky. Následující příklad ukazuje, jak uvozit uvozovky, aby byly zahrnuty ve výsledném řetězci:

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 vrací řetězec, jehož interpolované řetězcové výrazy byly nahrazeny jejich řetězcovými reprezentacemi. Napří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 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é vytvořené 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 metodě formátování řetězce, například WriteLine(String), formátové položky se vyřeší a výsledný řetězec je 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 formátovacího řetězce a způsobu jeho vykreslení jako výsledného řetězce může například pomoci chránit před injekčním útokem, pokud vytváříte dotaz. A FormattableString také zahrnuje:

    Všechny výskyty dvojitých složených závorek ("{{" a "}}") zůstanou jako dvojité složené závorky, než je naformátujete. 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é