Interpolación de cadenas en C#

Sugerencia

Este artículo forma parte de la sección Aspectos básicos de los desarrolladores que ya conocen al menos un lenguaje de programación y están aprendiendo C#. Si no está familiarizado con la programación, comience primero con los tutoriales de introducción .

¿Viene de otro idioma? La interpolación de cadenas en C# funciona de forma muy similar a los literales de plantilla en JavaScript (`${x}`) o las cadenas f en Python (f"{x}"). La expresión dentro {} puede ser cualquier expresión de C# válida y puede agregar especificadores de formato y alineación sin salir de la cadena.

La interpolación de cadenas permite insertar expresiones directamente en un literal de cadena mediante el prefijo del literal con $:

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);
// => 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

Cada { } es una expresión de interpolación. C# evalúa la expresión, convierte el resultado en una cadena llamando a su ToString() método y sustituye el texto en el resultado. La interpolación de cadenas de una expresión null es la cadena vacía. En la mayoría de los casos, la conversión predeterminada genera la salida que desea y no es necesario hacer nada más.

Las cadenas interpoladas son una alternativa más legible a String.Formaty admiten el conjunto de características de formato compuesto completo. Todo lo que se puede hacer con una cadena de formato posicional clásica (especificadores de formato, alineación, formato según la referencia cultural y cadenas constantes) también se puede hacer con una cadena interpolada. El resto de este artículo trata esas opciones. Recurra a ellos solo cuando necesite un control más preciso del resultado; de lo contrario, la forma simple $"{expression}" es suficiente.

Para obtener el tratamiento de referencia del lenguaje de la sintaxis y los tipos de controlador subyacentes, consulte referencia de cadena interpolada . Para temas centrados en el rendimiento, como la interpolación y los controladores personalizados de cadenas interpoladas de Span<char>, consulte Operaciones con cadenas.

Aplicación de una cadena de formato

Para controlar cómo se da formato a un resultado de expresión, siga la expresión con dos puntos y una cadena de formato estándar o personalizada:

{<expression>:<formatString>}

El siguiente ejemplo da formato a un valor DateTime y a un valor Double:

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}.");
// => On Sunday, November 25, 1731 L. Euler introduced the letter e to denote 2.71828.

Establecer el ancho y la alineación del campo

Para generar una salida alineada, siga la expresión con una coma y un ancho de campo mínimo. Las anchuras positivas alinean el valor a la derecha, y las negativas lo alinean a la izquierda:

{<expression>,<width>}
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}|");
}
// => 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|

Cuando necesite alineación y una cadena de formato, coloque primero la alineación:

{<expression>,<width>:<formatString>}
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}|");
// => Three classical Pythagorean means of 3 and 4:
// => |Arithmetic|  3.500|
// => |Geometric|  3.464|
// => |Harmonic |  3.429|

Si el valor con formato es mayor que el ancho solicitado, C# omite el ancho y emite el valor completo.

Llaves de escape y uso de secuencias de escape

Las cadenas interpoladas admiten las mismas secuencias de escape que los literales de cadena normales. Para incluir el carácter literal { o } en el resultado, duplíquelo ({{ o }}).

En el caso de las rutas de acceso y otras cadenas que contienen barras diagonales inversas, se prefiere un literal de cadena sin formato interpolado ($"""...""") sobre la forma textual anterior ($@"..."). Los literales de cadena sin formato no procesan secuencias de escape, por lo que las barras invertidas aparecen tal cual:

int[] xs = [1, 2, 7, 9];
int[] ys = [7, 9, 12];
Console.WriteLine($"Find the intersection of the {{{string.Join(", ", xs)}}} and {{{string.Join(", ", ys)}}} sets.");
// => Find the intersection of the {1, 2, 7, 9} and {7, 9, 12} sets.

var userName = "Jane";
var stringWithEscapes = $"C:\\Users\\{userName}\\Documents";
var rawInterpolated = $"""C:\Users\{userName}\Documents""";
Console.WriteLine(stringWithEscapes);
Console.WriteLine(rawInterpolated);
// => C:\Users\Jane\Documents
// => C:\Users\Jane\Documents

Uso de una expresión condicional

Los dos puntos tienen un significado especial dentro de una expresión de interpolación, por lo que encapsulan una exoressuina condicional entre paréntesis:

var rand = new Random(42);
for (int i = 0; i < 3; i++)
{
    Console.WriteLine($"Coin flip: {(rand.NextDouble() < 0.5 ? "heads" : "tails")}");
}

Extender una expresión en varias líneas

Para mejorar la legibilidad, interrumpa las expresiones de interpolación largas entre varias líneas. Las expresiones de interpolación de varias líneas están disponibles desde C# 11. En el ejemplo siguiente se agregan nuevas líneas entre los { caracteres y } para separar las expresiones interpoladas del texto literal:

int[] numbers = [3, 1, 4, 1, 5, 9, 2, 6];
Console.WriteLine($"Total: {
        numbers.Sum()
        }, average: {numbers.Average():F2}.");
// => Total: 31, average: 3.88.

Crear cadenas constantes

Puede crear cadenas interpoladas constantes cuando cada expresión interpolada es un valor constante. Esto hace que se pueda usar para argumentos de atributo, switch patrones y otros contextos que requieren constantes en tiempo de compilación:

const string Audience = "world";
const string Greeting = $"Hello, {Audience}!";
Console.WriteLine(Greeting);
// => Hello, world!

Formato con una referencia cultural específica

De forma predeterminada, una cadena interpolada da formato a los valores mediante CultureInfo.CurrentCulture, que afecta a las representaciones de fecha, número y moneda. Para obtener un resultado determinista, especifique una referencia cultural explícita en String.Create(IFormatProvider, DefaultInterpolatedStringHandler):

CultureInfo[] cultures =
[
    CultureInfo.GetCultureInfo("en-US"),
    CultureInfo.GetCultureInfo("en-GB"),
    CultureInfo.GetCultureInfo("nl-NL"),
    CultureInfo.InvariantCulture
];
var date = new DateTime(2026, 5, 21, 12, 35, 31);
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       5/21/2026 12:35:31 PM      31,415,926.536
// => en-GB         21/05/2026 12:35:31      31,415,926.536
// => nl-NL         21-05-2026 12:35:31      31.415.926,536
// =>               05/21/2026 12:35:31      31,415,926.536

Para la salida invariable (registros, formatos de archivo, datos legibles por máquina), pase CultureInfo.InvariantCulture:

var timestamp = new DateTime(2026, 5, 21, 15, 46, 24);
string message = string.Create(CultureInfo.InvariantCulture, $"Date and time in invariant culture: {timestamp}");
Console.WriteLine(message);
// => Date and time in invariant culture: 05/21/2026 15:46:24

Consulte también