This article is currently in the process of being translated into Spanish (~99% done).
The String Interpolation Operator
En alguna otra parte en este tutorial, encontrará una descripción larga del tipo de dato cadena, por que lidiar con texto es una tarea tan importante. En este artículo nos enfocaremos en un operador especial para trabajar con cadenas, permitiendole hacer unas cuantos trucos extra cuando declara cadenas. Es llamado el operador de interpolación de cadena (introducido en C# versión 6) y le permitirá poner marcadores especiales en sus cadenas, los cuales el compilador más tarde reemplazará con los valores relevantes. Trabaja muy parecido al método String.Format() que ya discutimos, pero la sintáxis es más legible y conveniente.
La interpolación de cadena puede ser obtenida muy fácilmente - sólo anteponga la cadena con un caracter $. Como siempre, saltaremos directo a un ejemplo:
string name = "John Doe";
int age = 42;
Console.WriteLine(name + " is " + age + " years old");
Console.WriteLine($"{name} is {age} years old");
En las dos últimas líneas, hacemos exactamente lo mismo: primero en la forma tradicional, donde concatenamos una cadena usando nuestras dos variables, y después usando interpolación de cadenas. Note como nos permite inyectar variables directamente en la cadena al rodearla con unos corchetes rizados. Y aunque esto sucede dentro de una cadena, ¡El compilador en realidad verificará las variables que usted está tratando de inyectar!
Además, las variables que use no tienen que ser tipos simples - usted puede usar propiedades de objetos complejos también, sólo como podría si estuviera haciendo una común concatenación de cadenas. Aquí está un ejemplo:
var user = new
{
Name = "John Doe",
Age = 42
};
Console.WriteLine($"{user.Name} is {user.Age} years old");
Cadenas de formato
Por defecto, las variables que incluya serán tornadas en la representación requerida de cadena al llamar el método ToString() en ellas. Pero a veces quizá este buscando un poco más de control sobre como cada variable es desplegada, y afortunadamente, esto es muy simple de hacer, gracias a las cadenas de formato. Simplemente ponga dos puntos (:) después de la variable y entonces ingrese una cadena de formato para ser usada, como en este ejemplo:
double daysSinceMillenium = (DateTime.Now - new DateTime(2000, 1, 1)).TotalDays;
Console.WriteLine($"Today is {DateTime.Now:d} and {daysSinceMillenium:N2} days have passed since the last millennium!");
El resultado se verá algo como esto, dependiendo de la configuración de su sistema para fechas y números:
Today is Friday, June 29, 2018 and 6,754.49 days have passed since the last millenium!
Note cómo la fecha es representada en un formato de fecha larga (como es especificado con la cadena de formato "D") y el número es formateado elegantemente con separador de miles y dos números decimales, gracias a la cadena de formato numérico "N2".
Si desea más control aún, puede cambiar de la cadena de formato por defecto a una cadena de formato personalizada, por ejemplo para fechas:
Console.WriteLine($"Today is {DateTime.Now:yyyy-MM-dd}");
Hay muchas formas más de formatear un DateTime, que usted puede usar en una cadena interpolada. Para todas las opciones, por favor consulte la documentación.
Más allá de las variables
Ahora hemos incluido variables e incluso propiedades de objetos en nuestras cadenas y hemos visto que fácil podemos dar formato a las cadenas resultantes. Pero la interpolación de cadenas va más allá de esto, por que usted puede en realidad tener expresiones enteras de C# dentro de sus cadenas, mientras resulten en algo que pueda anexarse a una cadena. Un gran ejemplo es la clásica situación de "con o sin s final", donde tiene que crear una cadena que es "1 year old" o "2 years old". Puede hacer eso directamente con interpolación de cadenas, simplemente usando el operador ternario dentro de la cadena:
string name = "John Doe";
int age = 42;
Console.WriteLine($"{name} is {age} year{(age == 1 ? "" : "s")} old");
Note cómo he insertado una declaración simple if-then-else dentro de la cadena, dentro del conjunto de paréntesis. Podemos hacer esto por que el resultado de la expresión es una cadena - ya sea una vacía o una "s". Usted puede hacer matemáticas también:
Console.WriteLine($"5 + 5 * 2 = {((5 + 5) * 2)}");
De nuevo, mientras el resultado de la expresión pueda tornarse en una cadena, puede usarlo dentro de sus cadenas interpoladas.
Interpolación de Cadenas y Escape
No habrá trabajado mucho con interpolación de cadenas antes de que una pregunta obvia venga a su mente. ¿Cómo puedo incluir caracteres que tienen un significado específico, por ejemplo los paréntesis rizados, y que sean tratados literalmente? La respuesta a esto es usualmente los escapes - el acto de prefijar o posfijar un caracter con otro caracter, para negar el propósito especial. Esto también es verdad para interpolación de cadenas, donde los paréntesis rizados deben ser escritos dobles si quiere que sean tratados literalmente, como esto:
Console.WriteLine($"Insert {name} between curly braces: {{name here}}");
El resultado:
Insert John Doe between curly braces: {name here}
Resumen
Si ha visto la concatenación clásica de cadenas y pensó que es muy torpe, ¡Amará la interpolación de cadenas! Fue introducida en C# versión 6.0 y le permite escribir texto el cual incluye variables en una forma muy natural y fácil de leer. También son geniales al permitirle integrar expresiones directamente dentro de las cadenas, pero tenga cuidado - en un cierto punto, sus cadenas interpoladas tal vez sean demasiado avanzadas que serán más difíciles de leer que las otras alternativas.