Pregunta ¿Qué significa $ antes de una cadena?


Iba a usar una cadena literal, pero escribí erróneamente $ en lugar de @.

Pero el compilador no me dio ningún error y compiló con éxito.

Quiero saber qué es y qué hace. Lo busqué pero no pude encontrar nada.

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

string str = $"text\";

¿Alguien sabe qué? $ antes de la cadena representan C #.

string str = $"text";

Estoy usando Visual Studio 2015 CTP.


198
2018-06-23 22:57


origen


Respuestas:


$ es de corta duración para String.Format y se utiliza con interpolaciones de cadenas, que es una nueva característica de C # 6. Como se usa en su caso, no hace nada, al igual que string.Format() no haría nada.

Es independiente cuando se usa para construir cadenas con referencia a otros valores. Lo que antes tenía que 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 hay una forma alternativa menos conocida de interpolación de cadenas utilizando $@  (el orden de los dos símbolos es importante). Permite las características de un @"" cadena para mezclar con $"" para admitir interpolaciones de cadenas sin la necesidad de \\ a lo largo de su cadena. Entonces las siguientes dos líneas:

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

dará salida:

c:\a\b\c

327
2018-06-23 23:00



Crea un cuerda interpolada.

De MSDN

Usado para construir cadenas. Una expresión de cadena interpolada se ve   como una cadena de plantilla que contiene expresiones. Una interpolación   expresión de cadena crea una cadena reemplazando el contenido   expresiones con las representaciones ToString de las expresiones '   resultados.

ex:

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

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

Puede usar expresiones dentro de la cadena interpolada

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

Lo bueno es que no tiene que 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 quiere eliminar algunos parámetros, tiene que ir y actualizar todos los recuentos, que ya no es el caso.

Tenga en cuenta que el bien viejo string.format sigue siendo relevante si desea especificar información cultural en su formateo.


33
2018-06-23 23:06



Es Cuerdas interpoladas. Puede usar una cadena interpolada en cualquier lugar donde pueda usar una cadena literal. Cuando ejecute su programa ejecutará 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.

var message = $"Sample, {text}";

Este ejemplo produce un valor de cadena donde se han calculado todos los valores de interpolación de cadenas. Es el resultado final y tiene una cadena tipo. Todas las apariciones de doble llaves (“{{“ and “}}”) se convierten en un solo corsé.

Si,

string text = "One";

Entonces message contiene "Muestra, Uno".

Console.WriteLine(message); // Sample, One

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}");

Salida

Full name - Albert Einstein
Full name - Albert Einstein
Full name - Albert Einstein

Referencia - MSDN


16
2018-06-23 23:03



Buena característica. Solo quiero señalar el énfasis en por qué esto es mejor que string.format si no es aparente para algunas personas.

Leí a alguien que decía ordenar string.format a "{0} {1} {2}" para que coincida con los parámetros. No está obligado a pedir "{0} {1} {2}" en string.format, también puede hacer "{2} {0} {1}". Sin embargo, si tiene muchos parámetros, como 20, realmente desea secuenciar la cadena a "{0} {1} {2} ... {19}". Si se trata de un lío arrastrado, tendrá dificultades para 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 fácilmente el parámetro en la cadena, debes escribirlo. Por ejemplo, si está cansado de escribir System.Environment.NewLine, puede hacer string.format ("... {0} ... {0} ... {0}", System.Environment.NewLine), pero, en $, tienes que repetirlo. No puede hacer $ "{0}" y pasarlo a string.format porque $ "{0}" devuelve "0".

En la nota lateral, he leído un comentario en otro tpoic duplicado. No pude comentar, entonces, aquí está. Dijo que

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

crea más de un objeto de cadena. Esto no es verdad en realidad. Si hace esto en una sola línea, solo crea una cadena y se coloca en la memoria 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 la memoria caché.

Por otra parte:

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

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

Por lo tanto, será más fácil escribir código como el siguiente, pero crearía 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 la memoria caché mientras que usted tiene un código muy fácil de leer. No estoy seguro del rendimiento, pero estoy seguro de que MS lo optimizará si no lo hace.


9
2018-04-10 21:52



Tenga en cuenta que también puede combinar los dos, que es bastante bueno (aunque parece un poco extraño):

// simple interpolated verbatim string
WriteLine($@"Path ""C:\Windows\{file}"" not found.");

7
2018-01-16 14:17



Es más conveniente que string.Format y puedes usar intellisense aquí también.

enter image description here

Y aquí está mi método de prueba:

[TestMethod]
public void StringMethodsTest_DollarSign()
{
    string name = "Forrest";
    string surname = "Gump";
    int year = 3; 
    string sDollarSign = $"My name is {name} {surname} and once I run more than {year} years."; 
    string expectedResult = "My name is Forrest Gump and once I run more than 3 years."; 
    Assert.AreEqual(expectedResult, sDollarSign);
}

6
2018-01-18 13:45



No sé cómo funciona, ¡pero también puedes usarlo para tabular tus valores!

Ejemplo:

Console.WriteLine($"I can tab like {"this !", 5}.");

Por supuesto, puedes reemplazar "esto!" con cualquier variable o cualquier cosa significativa, al igual que también puede cambiar la pestaña.


5
2018-05-03 06:55



El siguiente ejemplo resalta varias ventajas del uso de cadenas interpoladas sobre string.Format() en cuanto a limpieza y legibilidad. También muestra ese código dentro {} se evalúa como cualquier otro argumento de función, como lo haría si string.Format() estamos siendo llamados.

using System;

public class Example
{
   public static void Main()
   {
      var name = "Horace";
      var age = 34;
      // replaces {name} with the value of name, "Horace"
      var s1 = $"He asked, \"Is your name {name}?\", but didn't wait for a reply.";
      Console.WriteLine(s1);

      // as age is an integer, we can use ":D3" to denote that
      // it should have leading zeroes and be 3 characters long
      // see https://docs.microsoft.com/en-us/dotnet/standard/base-types/how-to-pad-a-number-with-leading-zeros
      //
      // (age == 1 ? "" : "s") uses the ternary operator to 
      // decide the value used in the placeholder, the same 
      // as if it had been placed as an argument of string.Format
      //
      // finally, it shows that you can actually have quoted strings within strings
      // e.g. $"outer { "inner" } string"
      var s2 = $"{name} is {age:D3} year{(age == 1 ? "" : "s")} old.";
      Console.WriteLine(s2); 
   }
}
// The example displays the following output:
//       He asked, "Is your name Horace?", but didn't wait for a reply.
//       Horace is 034 years old.

5
2018-06-16 08:48