Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este tutorial se muestra cómo usar la interpolación de cadenas para dar formato e incluir resultados de expresión en una cadena de resultado. En los ejemplos se supone que está familiarizado con los conceptos básicos de C# y el formato de tipos de .NET. Para obtener más información sobre los tipos de formato en .NET, vea Formato de tipos en .NET.
Introducción
Para distinguir un literal de cadena como una cadena interpolada, antepóngale el símbolo $
. Puede insertar cualquier expresión de C# válida que devuelva un valor en una cadena interpolada. En el ejemplo siguiente, tan pronto como se evalúa una expresión, su resultado se convierte en una cadena y se incluye en una cadena de resultado:
double a = 3;
double b = 4;
Console.WriteLine($"Area of the right triangle with legs of {a} and {b} is {0.5 * a * b}");
Console.WriteLine($"Length of the hypotenuse of the right triangle with legs of {a} and {b} is {CalculateHypotenuse(a, b)}");
double CalculateHypotenuse(double leg1, double leg2) => Math.Sqrt(leg1 * leg1 + leg2 * leg2);
// Output:
// Area of the right triangle with legs of 3 and 4 is 6
// Length of the hypotenuse of the right triangle with legs of 3 and 4 is 5
Como muestra el ejemplo, se incluye una expresión en una cadena interpolada al rodearla con llaves.
{<interpolationExpression>}
Las cadenas interpoladas admiten todas las funcionalidades de la característica de formato compuesto de cadenas . Esto hace que sean una alternativa más legible al uso del String.Format método . Cada cadena interpolada debe tener:
- Literal de cadena que comienza con el carácter
$
antes de su carácter de comillas de apertura. No puede haber ningún espacio entre el$
símbolo y el carácter de comillas. - Una o varias expresiones de interpolación. Indica una expresión de interpolación con una llave de apertura y cierre (
{
y}
). Puede colocar cualquier expresión de C# que devuelva un valor (incluidonull
) dentro de las llaves.
C# evalúa la expresión entre los {
caracteres y }
con las reglas siguientes:
- Si la expresión de interpolación se evalúa como
null
, se usa una cadena vacía ("", o String.Empty). - Si la expresión de interpolación no se evalúa como
null
, normalmente se llama al métodoToString
del tipo de resultado.
Cómo especificar una cadena de formato para una expresión de interpolación
Para especificar una cadena de formato compatible con el tipo del resultado de la expresión, siga la expresión de interpolación con dos puntos (":") y la cadena de formato:
{<interpolationExpression>:<formatString>}
En el ejemplo siguiente se muestra cómo especificar cadenas de formato estándar y personalizado para expresiones que producen resultados numéricos o de fecha y hora:
var date = new DateTime(1731, 11, 25);
Console.WriteLine($"On {date:dddd, MMMM dd, yyyy} L. Euler introduced the letter e to denote {Math.E:F5}.");
// Output:
// On Sunday, November 25, 1731 L. Euler introduced the letter e to denote 2.71828.
Para más información, vea la sección Componente de cadena de formato del artículo Formatos compuestos.
Cómo controlar el ancho y la alineación del campo de la expresión de interpolación con formato
Para especificar el ancho de campo mínimo y la alineación del resultado de la expresión con formato, siga la expresión de interpolación con una coma (",") y la expresión constante:
{<interpolationExpression>,<width>}
En el ejemplo de código siguiente se usa el ancho de campo mínimo para crear una salida tabular:
var titles = new Dictionary<string, string>()
{
["Doyle, Arthur Conan"] = "Hound of the Baskervilles, The",
["London, Jack"] = "Call of the Wild, The",
["Shakespeare, William"] = "Tempest, The"
};
Console.WriteLine("Author and Title List");
Console.WriteLine();
Console.WriteLine($"|{"Author",-25}|{"Title",30}|");
foreach (var title in titles)
{
Console.WriteLine($"|{title.Key,-25}|{title.Value,30}|");
}
// Output:
// Author and Title List
//
// |Author |Title |
// |Doyle, Arthur Conan |Hound of the Baskervilles, The |
// |London, Jack | Call of the Wild, The |
// |Shakespeare, William | Tempest, The |
Si el valor de ancho es positivo, el resultado de la expresión con formato está alineado a la derecha; si es negativo, está alineado a la izquierda. Quite los -
signos antes del especificador de ancho y vuelva a ejecutar el ejemplo para ver los resultados.
Si necesita especificar el ancho y una cadena de formato, comience con el componente width:
{<interpolationExpression>,<width>:<formatString>}
En el ejemplo siguiente se muestra cómo especificar el ancho y la alineación, y se usan caracteres de canalización ("|") para delimitar campos de texto:
const int NameAlignment = -9;
const int ValueAlignment = 7;
double a = 3;
double b = 4;
Console.WriteLine($"Three classical Pythagorean means of {a} and {b}:");
Console.WriteLine($"|{"Arithmetic",NameAlignment}|{0.5 * (a + b),ValueAlignment:F3}|");
Console.WriteLine($"|{"Geometric",NameAlignment}|{Math.Sqrt(a * b),ValueAlignment:F3}|");
Console.WriteLine($"|{"Harmonic",NameAlignment}|{2 / (1 / a + 1 / b),ValueAlignment:F3}|");
// Output:
// Three classical Pythagorean means of 3 and 4:
// |Arithmetic| 3.500|
// |Geometric| 3.464|
// |Harmonic | 3.429|
Como se muestra en la salida de ejemplo, si la longitud del resultado de la expresión con formato supera el ancho de campo especificado, se omite el valor de width.
Para obtener más información, consulte la sección Componente de ancho del artículo Formato compuesto .
Uso de secuencias de escape en una cadena interpolada
Las cadenas interpoladas admiten todas las secuencias de escape que se pueden usar en literales de cadena normales. Para obtener más información, consulte secuencias de escape de cadena.
Para interpretar las secuencias de escape literalmente, use un literal de cadena textual. Una cadena textual interpolada comienza con ambos caracteres $
y @
. Los tokens $
y @
se pueden usar en cualquier orden; tanto $@"..."
como @$"..."
son cadenas textuales interpoladas válidas.
Para incluir una llave, "{" o "}", en una cadena de resultado, se deben usar dos llaves, "{{" o "}}". Para más información, vea la sección Llaves de escape del tema Formatos compuestos.
En el ejemplo siguiente se muestra cómo incluir llaves en una cadena de resultados y construir una cadena interpolada literal:
var xs = new int[] { 1, 2, 7, 9 };
var ys = new int[] { 7, 9, 12 };
Console.WriteLine($"Find the intersection of the {{{string.Join(", ",xs)}}} and {{{string.Join(", ",ys)}}} sets.");
// Output:
// Find the intersection of the {1, 2, 7, 9} and {7, 9, 12} sets.
var userName = "Jane";
var stringWithEscapes = $"C:\\Users\\{userName}\\Documents";
var verbatimInterpolated = $@"C:\Users\{userName}\Documents";
Console.WriteLine(stringWithEscapes);
Console.WriteLine(verbatimInterpolated);
// Output:
// C:\Users\Jane\Documents
// C:\Users\Jane\Documents
A partir de C# 11, puede usar literales de cadena interpolados sin procesar.
Uso de un operador ?:
condicional ternario en una expresión de interpolación
Como los dos puntos (":") tienen un significado especial en un elemento con una expresión de interpolación, con el fin de usar un operador condicional en una expresión, escríbalo entre paréntesis, como se muestra en el ejemplo siguiente:
var rand = new Random();
for (int i = 0; i < 7; i++)
{
Console.WriteLine($"Coin flip: {(rand.NextDouble() < 0.5 ? "heads" : "tails")}");
}
Cómo crear una cadena de resultado específica de la cultura mediante interpolación de cadenas
Las cadenas interpoladas usan de forma predeterminada la referencia cultural definida actualmente por la propiedad CultureInfo.CurrentCulture en todas las operaciones de formato.
A partir de .NET 6, puede usar el método String.Create(IFormatProvider, DefaultInterpolatedStringHandler) para obtener una cadena de resultado específica de la cultura a partir de una cadena interpolada, como se muestra en el ejemplo siguiente.
var cultures = new System.Globalization.CultureInfo[]
{
System.Globalization.CultureInfo.GetCultureInfo("en-US"),
System.Globalization.CultureInfo.GetCultureInfo("en-GB"),
System.Globalization.CultureInfo.GetCultureInfo("nl-NL"),
System.Globalization.CultureInfo.InvariantCulture
};
var date = DateTime.Now;
var number = 31_415_926.536;
foreach (var culture in cultures)
{
var cultureSpecificMessage = string.Create(culture, $"{date,23}{number,20:N3}");
Console.WriteLine($"{culture.Name,-10}{cultureSpecificMessage}");
}
// Output is similar to:
// en-US 8/27/2023 12:35:31 PM 31,415,926.536
// en-GB 27/08/2023 12:35:31 31,415,926.536
// nl-NL 27-08-2023 12:35:31 31.415.926,536
// 08/27/2023 12:35:31 31,415,926.536
En versiones anteriores de .NET, use la conversión implícita de una cadena interpolada a una instancia System.FormattableString y llame al método ToString(IFormatProvider) de esta instancia para crear una cadena de resultado específica de la cultura. En el siguiente ejemplo se muestra cómo hacerlo:
var cultures = new System.Globalization.CultureInfo[]
{
System.Globalization.CultureInfo.GetCultureInfo("en-US"),
System.Globalization.CultureInfo.GetCultureInfo("en-GB"),
System.Globalization.CultureInfo.GetCultureInfo("nl-NL"),
System.Globalization.CultureInfo.InvariantCulture
};
var date = DateTime.Now;
var number = 31_415_926.536;
FormattableString message = $"{date,23}{number,20:N3}";
foreach (var culture in cultures)
{
var cultureSpecificMessage = message.ToString(culture);
Console.WriteLine($"{culture.Name,-10}{cultureSpecificMessage}");
}
// Output is similar to:
// en-US 8/27/2023 12:35:31 PM 31,415,926.536
// en-GB 27/08/2023 12:35:31 31,415,926.536
// nl-NL 27-08-2023 12:35:31 31.415.926,536
// 08/27/2023 12:35:31 31,415,926.536
Como muestra el ejemplo, puede usar una instancia FormattableString para generar múltiples resultados para varias culturas.
Cómo crear una cadena de texto resultante usando la cultura invariable
A partir de .NET 6, use el String.Create(IFormatProvider, DefaultInterpolatedStringHandler) método para resolver una cadena interpolada en una cadena de resultado para InvariantCulture, como se muestra en el ejemplo siguiente:
string message = string.Create(CultureInfo.InvariantCulture, $"Date and time in invariant culture: {DateTime.Now}");
Console.WriteLine(message);
// Output is similar to:
// Date and time in invariant culture: 05/17/2018 15:46:24
En versiones anteriores de .NET, junto con el FormattableString.ToString(IFormatProvider) método , puede usar el método estático FormattableString.Invariant , como se muestra en el ejemplo siguiente:
string message = FormattableString.Invariant($"Date and time in invariant culture: {DateTime.Now}");
Console.WriteLine(message);
// Output is similar to:
// Date and time in invariant culture: 05/17/2018 15:46:24
Conclusión
En este tutorial se describen escenarios comunes de uso de interpolación de cadenas. Para obtener más información sobre la interpolación de cadenas, vea Interpolación de cadenas. Para obtener más información sobre los tipos de formato en .NET, consulte los artículos Formato de tipos en .NET y Formato compuesto .