Delen via


Geïnterpoleerde tekenreeksen (Visual Basic Reference)

Wordt gebruikt om tekenreeksen samen te stellen. Een geïnterpoleerde tekenreeks ziet eruit als een sjabloontekenreeks die geïnterpoleerde expressies bevat. Een geïnterpoleerde tekenreeks geeft een tekenreeks terug waarbij de geïnterpoleerde uitdrukkingen worden vervangen door hun tekenreeksweergaven. Deze functie is beschikbaar in Visual Basic 14 en nieuwere versies.

De argumenten van een geïnterpoleerde tekenreeks zijn gemakkelijker te begrijpen dan een samengestelde notatietekenreeks. De volgende geïnterpoleerde tekenreeks bevat bijvoorbeeld twee geïnterpoleerde expressies en {name}{hours:hh}:

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

De equivalente tekenreeks voor samengestelde notatie is:

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

De structuur van een geïnterpoleerde tekenreeks is:

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

Waar:

  • field-width is een ondertekend geheel getal dat het aantal tekens in het veld aangeeft. Als het positief is, wordt het veld rechts uitgelijnd; indien negatief, links uitgelijnd.

  • format-string is een notatietekenreeks die geschikt is voor het type object dat wordt opgemaakt. Voor een DateTime waarde kan het bijvoorbeeld een standaardtekenreeks voor datum- en tijdnotatie zijn, zoals 'D' of 'd'.

Belangrijk

U kunt geen witruimte hebben tussen de $ en de " waarmee de tekenreeks begint. Dit veroorzaakt een compilerfout.

U kunt een geïnterpoleerde tekenreeks overal gebruiken waar u een letterlijke tekenreeks kunt gebruiken. De geïnterpoleerde tekenreeks wordt telkens geëvalueerd wanneer de code met de geïnterpoleerde tekenreeks wordt uitgevoerd. Hiermee kunt u de definitie en evaluatie van een geïnterpoleerde tekenreeks scheiden.

Als u een accolade ("{" of "}") wilt opnemen in een geïnterpoleerde string, gebruikt u twee accolades: "{{" of "}}". Zie Impliciete conversies voor meer informatie.

Als de geïnterpoleerde tekenreeks andere tekens bevat met speciale betekenis, zoals het aanhalingsteken ("), dubbelpunt (:) of komma (,), moeten ze worden geescaped als ze voorkomen in letterlijke tekst. Of als ze taalelementen zijn die zijn opgenomen in een geïnterpoleerde expressie, moeten ze worden opgenomen in een expressie die wordt gescheiden door haakjes. Het volgende voorbeeld toont hoe je aanhalingstekens kunt escapen om ze in de resultaatstring weer te geven.

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.

Impliciete conversies

Er zijn drie impliciete typeconversies van een geïnterpoleerde tekenreeks:

  1. Conversie van een geïnterpoleerde tekenreeks naar een String. In het volgende voorbeeld wordt een tekenreeks geretourneerd waarvan geïnterpoleerde tekenreeksexpressies zijn vervangen door de tekenreeksweergaven. Voorbeeld:

    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>
    

    Dit is het uiteindelijke resultaat van een interpretatie van een reeks tekens. Alle voorkomens van dubbele accolades ("{{" en "}}") worden geconverteerd naar één accolade.

  2. Conversie van een geïnterpoleerde tekenreeks naar een IFormattable variabele waarmee u meerdere resultaattekenreeksen kunt maken met cultuurspecifieke inhoud van één IFormattable exemplaar. Dit is handig voor het opnemen van bijvoorbeeld de juiste numerieke en datumnotaties voor afzonderlijke culturen. Alle instances van dubbele accolades ("{{" en "}}") blijven dubbele accolades totdat u de tekenreeks opmaakt door expliciet of impliciet de methode ToString() aan te roepen. Alle ingesloten interpolatie-expressies worden geconverteerd naar {0}, {1}enzovoort.

    In het volgende voorbeeld wordt weerspiegeling gebruikt om de leden weer te geven, evenals de veld- en eigenschapswaarden van een IFormattable variabele die is gemaakt op basis van een geïnterpoleerde tekenreeks. De variabele IFormattable wordt ook doorgegeven aan de methode 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>
    
    

    Houd er rekening mee dat de geïnterpoleerde tekenreeks alleen kan worden geïnspecteerd met behulp van reflectie. Als deze wordt doorgegeven aan een opmaakmethode voor tekenreeksen, zoals WriteLine(String), worden de opmaakitems omgezet en wordt de resultaattekenreeks geretourneerd.

  3. Conversie van een geïnterpoleerde tekenreeks naar een FormattableString variabele die een samengestelde notatietekenreeks vertegenwoordigt. Het inspecteren van de indelingsreeks en hoe deze wordt weergegeven als resultaatreeks, kan u bijvoorbeeld helpen om te beschermen tegen een injectieaanval terwijl u een query maakt. Een FormattableString omvat ook:

    Alle exemplaren van dubbele accolades ({{{ en }}) blijven behouden als dubbele accolades totdat u de opmaak hebt uitgevoerd. Alle ingesloten interpolatie-expressies worden geconverteerd naar {0}, {1}enzovoort.

    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!
    
    

Zie ook