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 retourneert een tekenreeks die de geïnterpoleerde expressies vervangt door de 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. Bijvoorbeeld de geïnterpoleerde tekenreeks

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

bevat twee geïnterpoleerde expressies: {name} en {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> ..."

waarbij geldt:

  • veldbreedte 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 opmaaktekenreeks 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 " tekenreeks die wordt gestart. 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 tekenreeks, gebruikt u twee accolades: {{of }}. Zie de sectie Impliciete conversies voor meer informatie.

Als de geïnterpoleerde tekenreeks andere tekens bevat met speciale betekenis in een geïnterpoleerde tekenreeks, zoals het aanhalingsteken ("), dubbele punt (:) of komma (,), moeten ze worden ontsnapt als ze voorkomen in letterlijke tekst, of moeten ze worden opgenomen in een expressie die wordt gescheiden door haakjes als ze taalelementen zijn die zijn opgenomen in een geïnterpoleerde expressie. In het volgende voorbeeld worden aanhalingstekens om deze op te nemen in de resultaattekenreeks:

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 tekenreeksinterpretatie. Alle exemplaren 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 exemplaren van dubbele accolades ("{{" en "}}} blijven als dubbele accolades behouden totdat u de tekenreeks formatteert door expliciet of impliciet de methode aan ToString() te roepen. Alle ingesloten interpolatie-expressies worden geconverteerd naar {0}, {1}enzovoort.

    In het volgende voorbeeld wordt weerspiegeling gebruikt om de leden en de veld- en eigenschapswaarden weer te geven van een IFormattable variabele die is gemaakt op basis van een geïnterpoleerde tekenreeks. De variabele wordt ook doorgegeven IFormattable aan de Console.WriteLine(String) methode.

    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ïnterpoleerd met behulp van weerspiegeling. Als deze wordt doorgegeven aan een tekenreeksopmaakmethode, 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 tekenreeks voor samengestelde opmaak en hoe deze wordt weergegeven als resultaattekenreeks, kan u bijvoorbeeld helpen beschermen tegen een injectieaanval als u een query bouwt. 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