Condividi tramite


Stringhe interpolate (Riferimenti per Visual Basic)

Utilizzato per costruire stringhe. Una stringa interpolata è simile a una stringa di modello che contiene espressioni interpolate. Una stringa interpolata restituisce una stringa che sostituisce le espressioni interpolate che contiene con le relative rappresentazioni di stringa. Questa funzionalità è disponibile in Visual Basic 14 e versioni successive.

Gli argomenti di una stringa interpolata sono più facili da comprendere rispetto a una stringa di formato composito. Ad esempio, la stringa interpolata seguente contiene due espressioni interpolate e {name}{hours:hh}:

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

La stringa di formato composito equivalente è:

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

La struttura di una stringa interpolata è:

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

Dove:

  • field-width è un intero con segno che indica il numero di caratteri nel campo. Se è positivo, il campo è allineato a destra; se negativo, allineato a sinistra.

  • format-string è una stringa di formato appropriata per il tipo di oggetto da formattare. Ad esempio, per un DateTime valore, potrebbe essere una stringa di formato di data e ora standard , ad esempio "D" o "d".

Importante

Non puoi avere alcun spazio bianco tra $ e " che avvia la stringa. In questo modo viene generato un errore del compilatore.

È possibile usare una stringa interpolata ovunque si possa usare una stringa letterale. La stringa interpolata viene valutata ogni volta che viene eseguito il codice con la stringa interpolata. In questo modo è possibile separare la definizione e la valutazione di una stringa interpolata.

Per inserire una parentesi graffa ("{" o "}") in una stringa interpolata, è necessario usare due parentesi graffe, "{{" o "}}". Per altre informazioni, vedere Conversioni implicite.

Se la stringa interpolata contiene altri caratteri con un significato speciale in una stringa interpolata, ad esempio le virgolette ("), i due punti (:) o la virgola (,), devono essere preceduti da caratteri di escape se si verificano nel testo letterale. In alternativa, se sono elementi del linguaggio inclusi in un'espressione interpolata, devono essere inclusi in un'espressione delimitata da parentesi. Nell'esempio seguente le virgolette vengono precedute da caratteri di escape per includerle nella stringa di risultato:

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.

Conversioni implicite

Esistono tre conversioni di tipi implicite da una stringa interpolata:

  1. Conversione di una stringa interpolata in un oggetto String. Nell'esempio seguente viene restituita una stringa la cui espressione stringa interpolata è stata sostituita con le relative rappresentazioni di stringa. Per esempio:

    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>
    

    Questo è il risultato finale di un'interpretazione di una stringa. Tutte le occorrenze di parentesi graffe doppie ("{{" e "}}") vengono convertite in una singola parentesi graffa.

  2. Conversione di una stringa interpolata in una IFormattable variabile che consente, da una singola IFormattable istanza, di creare più stringhe di risultato con contenuto specifico della cultura. Ciò è utile per includere elementi come i formati numerici e di data corretti per le culture individuali. Tutte le occorrenze di parentesi graffe doppie ("{{" e "}}") rimangono parentesi graffe doppie fino a quando non si formatta la stringa chiamando in modo esplicito o implicito il metodo ToString(). Tutte le espressioni di interpolazione contenute vengono convertite in {0}, {1}e così via.

    Nell'esempio seguente viene utilizzata la reflection per visualizzare i membri, nonché i valori di campo e proprietà di una IFormattable variabile creata da una stringa interpolata. Passa anche la IFormattable variabile al Console.WriteLine(String) metodo .

    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>
    
    

    Si noti che la stringa interpolata può essere esaminata solo tramite reflection. Se viene passato a un metodo di formattazione di stringa, ad esempio WriteLine(String), i relativi elementi di formato vengono risolti e la stringa di risultato restituita.

  3. Conversione di una stringa interpolata in una FormattableString variabile che rappresenta una stringa di formato composito. Esaminare la stringa di formato composito e il modo in cui viene eseguito il rendering come stringa di risultato potrebbe, ad esempio, aiutarti a proteggerti da un attacco di injection se si costruisce una query. Un FormattableString include anche:

    Tutte le occorrenze di parentesi graffe doppie ("{{" e "}}") rimangono come parentesi graffe doppie fino al momento della formattazione. Tutte le espressioni di interpolazione contenute vengono convertite in {0}, {1}e così via.

    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!
    
    

Vedere anche