Cadenas interpoladas (referencia de Visual Basic)

Se utiliza para construir cadenas. Una cadena interpolada es similar a una cadena de plantilla que contiene expresiones interpoladas. Una cadena interpolada devuelve una cadena que reemplaza a las expresiones interpoladas que contiene por sus representaciones de cadena. Esta característica está disponible en Visual Basic 14 y versiones posteriores.

Los argumentos de una cadena interpolada son más fáciles de entender que una cadena de formato compuesto. Por ejemplo, la cadena interpolada

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

contiene dos expresiones interpoladas, "{name}" y "{hours:hh}". La cadena de formato compuesto equivalente es esta:

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

La estructura de una cadena interpolada es la siguiente:

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

donde:

  • field-width es un entero con signo que indica el número de caracteres del campo. Si es positivo, el campo está alineado a la derecha. Si es negativo, está alineado a la izquierda.

  • format-string es una cadena de formato adecuada para el tipo de objeto al que se da formato. Por ejemplo, para un valor DateTime, podría ser una cadena de formato estándar de fecha y hora, como "D" o "d".

Importante

No puede haber ningún espacio en blanco entre el carácter $ y el carácter " que inicia la cadena. Si lo hubiera, se produciría un error del compilador.

Puede utilizar una cadena interpolada en cualquier lugar que pueda utilizar un literal de cadena. La cadena interpolada se evalúa cada vez que se ejecuta el código con la cadena interpolada. Esto le permite separar la definición y la evaluación de una cadena interpolada.

Para incluir una llave ("{" o "}") en una cadena interpolada, use dos llaves, "{{" o "}}". Consulte la sección Conversiones implícitas para obtener más detalles.

Si la cadena interpolada contiene otros caracteres con un significado especial en una cadena interpolada, como comillas dobles ("), dos puntos (:) o coma (,), deben incluirse entre caracteres de escape si aparecen en texto literal, o bien deben incluirse en una expresión delimitada por paréntesis si son elementos del lenguaje incluidos en una expresión interpolada. En el ejemplo siguiente las comillas se incluyen entre caracteres de escape para incluirlas en la cadena de resultado:

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.

Conversiones implícitas

Hay tres conversiones de tipo implícito de una cadena interpolada:

  1. Conversión de una cadena interpolada a String. En el ejemplo siguiente se devuelve una cadena cuyas expresiones de cadena interpolada se han reemplazado por las representaciones de cadena. Por ejemplo:

    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>
    

    Este es el resultado final de una interpretación de cadena. Todas las apariciones de llaves dobles ("{{" y "}}") se convierten en una única llave.

  2. Conversión de una cadena interpolada a una variable IFormattable que permite crear varias cadenas de resultado con contenido específico de la referencia cultural de una sola instancia IFormattable. Esto resulta útil para incluir elementos como los formatos numéricos y de fecha correctos para cada referencia cultural. Todas las apariciones de llaves dobles ("{{" y "}}") permanecen como llaves dobles hasta que dé formato a la cadena mediante una llamada implícita o explícita al método ToString(). Todas las expresiones de interpolación incluidas se convierten en {0}, {1}, etc.

    En el ejemplo siguiente se usa la reflexión para mostrar los miembros y los valores de propiedad y campo de una variable IFormattable que se crea a partir de una cadena interpolada. También pasa la variable IFormattable al método 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>
    
    

    Tenga en cuenta que la cadena interpolada solo se puede inspeccionar mediante reflexión. Si se pasa a un método de formato de cadena, como WriteLine(String), sus elementos de formato se resuelven y se devuelve la cadena de resultado.

  3. Conversión de una cadena interpolada en una variable FormattableString que representa una cadena de formato compuesta. El hecho de inspeccionar la cadena de formato compuesto y la manera en que se presenta como cadena de resultado podría ayudarle a protegerse frente a un ataque por inyección si estuviese compilando una consulta. FormattableString también incluye:

    Todas las apariciones de llaves dobles ("{{" y "}}") permanecen como llaves dobles hasta que se aplica formato. Todas las expresiones de interpolación incluidas se convierten en {0}, {1}, etc.

    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!
    
    

Vea también