¿Qué significa $ antes de una cadena?

Resuelto M.kazem Akhgary asked hace 9 años • 11 respuestas

Iba a usar una cadena textual pero escribí por error $en lugar de @.

Pero el compilador no me dio ningún error y lo compiló exitosamente.

Quiero saber qué es y para qué sirve. Lo busqué pero no encontré nada.

Sin embargo, no es como una cadena textual porque no puedo escribir:

string str = $"text\";

¿Qué significa el $carácter delante de una cadena en C#?

string str = $"text";

Estoy usando Visual Studio 2015 CTP.

M.kazem Akhgary avatar Jun 24 '15 05:06 M.kazem Akhgary
Aceptado

$es una abreviatura de String.Formaty se usa con interpolaciones de cadenas, que es una nueva característica de C# 6. Tal como se usa en su caso, no hace nada, tal como string.Format()no haría nada.

Se destaca cuando se usa para construir cadenas con referencia a otros valores. Lo que anteriormente debía escribirse como:

var anInt = 1;
var aBool = true;
var aString = "3";
var formated = string.Format("{0},{1},{2}", anInt, aBool, aString);

Ahora se convierte en:

var anInt = 1;
var aBool = true;
var aString = "3";
var formated = $"{anInt},{aBool},{aString}";

También existe una forma alternativa, menos conocida, de interpolación de cadenas $@ (el orden de los dos símbolos es importante). Permite @""mezclar las características de una cadena $""para admitir interpolaciones de cadenas sin la necesidad de hacerlo \\a lo largo de la cadena. Entonces las siguientes dos líneas:

var someDir = "a";
Console.WriteLine($@"c:\{someDir}\b\c");

generará:

c:\a\b\c
David Arno avatar Jun 23 '2015 23:06 David Arno

Crea una cadena interpolada .

Desde MSDN

Se utiliza para construir cadenas. Una expresión de cadena interpolada parece una cadena de plantilla que contiene expresiones. Una expresión de cadena interpolada crea una cadena reemplazando las expresiones contenidas con las representaciones ToString de los resultados de las expresiones.

ex :

 var name = "Sam";
 var msg = $"hello, {name}";

 Console.WriteLine(msg); // hello, Sam

Puedes usar expresiones dentro de la cadena interpolada.

 var msg = $"hello, {name.ToLower()}";
 Console.WriteLine(msg); // hello, sam

Lo bueno de esto es que no necesita preocuparse por el orden de los parámetros como lo hace con String.Format.

  var s = String.Format("{0},{1},{2}...{88}",p0,p1,..,p88);

Ahora, si desea eliminar algunos parámetros, debe actualizar todos los recuentos, lo cual ya no es el caso.

Tenga en cuenta que lo antiguo string.formatsigue siendo relevante si desea especificar información cultural en su formato .

Sleiman Jneidi avatar Jun 23 '2015 23:06 Sleiman Jneidi

Código de ejemplo

public class Person {
    public String firstName { get; set; }
    public String lastName { get; set; }
}

// Instantiate Person
var person = new Person { firstName = "Albert", lastName = "Einstein" };

// We can print fullname of the above person as follows
Console.WriteLine("Full-Name - " + person.firstName + " " + person.lastName);
Console.WriteLine("Full-Name - {0} {1}", person.firstName, person.lastName);
Console.WriteLine($"Full-Name - {person.firstName} {person.lastName}");

Producción

Full-Name - Albert Einstein
Full-Name - Albert Einstein
Full-Name - Albert Einstein

Son cadenas interpoladas . Puede usar una cadena interpolada en cualquier lugar donde pueda usar un literal de cadena. Cuando al ejecutar su programa se ejecuta el código con el literal de cadena interpolado, el código calcula un nuevo literal de cadena evaluando las expresiones de interpolación. Este cálculo ocurre cada vez que se ejecuta el código con la cadena interpolada.

El siguiente ejemplo produce un valor de cadena donde se han calculado todos los valores de interpolación de cadena. Es el resultado final y tiene tipo cadena. Todas las apariciones de llaves dobles (“{{“ and “}}”)se convierten en una sola llave.

string text = "World";
var message = $"Hello, {text}";

Después de ejecutar las 2 líneas anteriores, la variable messagecontiene "Hola mundo".

Console.WriteLine(message); // Prints Hello, World

Referencia - MSDN

Saveendra Ekanayake avatar Jun 23 '2015 23:06 Saveendra Ekanayake

Característica interesante. Sólo quiero señalar el énfasis en por qué esto es mejor que string.format si no es evidente para algunas personas.

Leí a alguien diciendo orden string.format a "{0} {1} {2}" para que coincida con los parámetros. No está obligado a ordenar "{0} {1} {2}" en formato string.format, también puede hacer "{2} {0} {1}". Sin embargo, si tiene muchos parámetros, como 20, realmente querrá secuenciar la cadena en "{0} {1} {2}... {19}". Si se trata de un desastre, le resultará difícil alinear sus parámetros.

Con $, puede agregar parámetros en línea sin contar sus parámetros. Esto hace que el código sea mucho más fácil de leer y mantener.

La desventaja de $ es que no puedes repetir el parámetro en la cadena fácilmente, tienes que escribirlo. Por ejemplo, si está cansado de escribir System.Environment.NewLine, puede hacerlo string.format("...{0}....{0}....{0}", System.Environment.NewLine), pero, en $, hay que repetirlo. No puedes hacer $"{0}" y pasarlo a string.format porque $"{0}" devuelve "0".

Como nota al margen, leí un comentario en otro tema duplicado. No pude comentar, así que aquí está. Dijo que

string msg = n + " sheep, " + m + " chickens";

crea más de un objeto de cadena. En realidad, esto no es cierto. Si hace esto en una sola línea, solo crea una cadena y se coloca en el caché de cadenas.

1) string + string + string + string;
2) string.format()
3) stringBuilder.ToString()
4) $""

Todos ellos devuelven una cadena y solo crean un valor en el caché.

Por otro lado:

string+= string2;
string+= string2;
string+= string2;
string+= string2;

Crea 4 valores diferentes en el caché porque hay 4 ";".

Por lo tanto, será más fácil escribir código como el siguiente, pero crearías cinco cadenas interpoladas como corrigió Carlos Muñoz:

string msg = $"Hello this is {myName}, " +
  $"My phone number {myPhone}, " +
  $"My email {myEmail}, " +
  $"My address {myAddress}, and " +
  $"My preference {myPreference}.";

Esto crea una sola cadena en el caché mientras tiene un código muy fácil de leer. No estoy seguro del rendimiento, pero estoy seguro de que MS lo optimizará si aún no lo está haciendo.

BoBoDev avatar Apr 10 '2017 21:04 BoBoDev