web-dev-qa-db-fra.com

Que signifie $ avant une chaîne?

J'allais utiliser une chaîne de caractères, mais j'ai tapé par erreur $ au lieu de @.

Mais le compilateur ne m'a pas donné d'erreur et compilé avec succès.

Je veux savoir ce que c'est et ce qu'il fait. Je l'ai cherché mais je n'ai rien trouvé.

Cependant, ce n'est pas comme une chaîne textuelle parce que je ne peux pas écrire:

string str = $"text\";

Est-ce que quelqu'un sait ce que $ avant la chaîne représente en C #.

string str = $"text";

J'utilise Visual Studio 2015 CTP.

215
M.kazem Akhgary

$ est un raccourci pour String.Format et est utilisé avec les interpolations de chaînes, ce qui est une nouvelle fonctionnalité de C # 6. Utilisé dans votre cas, il ne fait rien, tout comme string.Format() ne ferait rien.

Il prend tout son sens lorsqu'il est utilisé pour construire des chaînes en référence à d'autres valeurs. Ce qui auparavant devait être écrit comme:

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

Devient maintenant:

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

Il existe également une autre forme d'interpolation de chaîne, moins connue, utilisant $@ (l'ordre des deux symboles est important). Il permet aux fonctionnalités d'une chaîne @"" d'être combinées avec $"" pour prendre en charge les interpolations de chaînes sans qu'il soit nécessaire d'utiliser \\ dans l'ensemble de votre chaîne. Donc, les deux lignes suivantes:

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

affichera:

c:\a\b\c
363
David Arno

Il crée une chaîne interpolée .

De MSDN

Utilisé pour construire des chaînes. Une expression de chaîne interpolée ressemble comme une chaîne de modèle qui contient des expressions. Un interpolé expression de chaîne crée une chaîne en remplaçant le contenu expressions avec les représentations de ToString des expressions ’ résultats.

ex:

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

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

Vous pouvez utiliser des expressions dans la chaîne interpolée

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

La bonne chose à ce sujet est que vous n'avez pas besoin de vous soucier de l'ordre des paramètres comme vous le faites avec String.Format.

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

Maintenant, si vous voulez supprimer certains paramètres, vous devez mettre à jour tous les comptages, ce qui n’est plus le cas.

Notez que le bon vieux string.format reste pertinent si vous souhaitez spécifier des informations culturelles dans votre formatage .

36
Sleiman Jneidi

C'est Interpolated Strings. Vous pouvez utiliser une chaîne interpolée n'importe où, vous pouvez utiliser un littéral de chaîne. Lorsque votre programme exécute le code avec le littéral de chaîne interpolé, le code calcule un nouveau littéral de chaîne en évaluant les expressions d'interpolation. Ce calcul a lieu à chaque fois que le code avec la chaîne interpolée est exécuté.

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

Cet exemple produit une valeur de chaîne où toutes les valeurs d'interpolation de chaîne ont été calculées. C'est le résultat final et le type chaîne. Toutes les occurrences de doubles accolades (“{{“ and “}}”) sont converties en une seule accolade.

Si,

string text = "One";

Alors message contient "Sample, One".

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

Exemple

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

Sortie

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

Référence - MSDN

16

Fonctionnalité cool. Je veux simplement souligner l’importance de pourquoi c’est mieux que string.format si cela n’est pas apparent pour certaines personnes.

J'ai lu quelqu'un disant que la commande string.format doit correspondre à "{0} {1} {2}" pour correspondre aux paramètres. Vous n'êtes pas obligé de commander "{0} {1} {2}" dans string.format, vous pouvez aussi faire "{2} {0} {1}". Cependant, si vous avez beaucoup de paramètres, comme 20, vous voulez vraiment que la chaîne soit "{0} {1} {2} ... {19}". S'il s'agit d'un gâchis aléatoire, vous aurez du mal à aligner vos paramètres.

Avec $, vous pouvez ajouter un paramètre en ligne sans compter vos paramètres. Cela rend le code beaucoup plus facile à lire et à maintenir.

L'inconvénient de $ est que vous ne pouvez pas répéter le paramètre dans la chaîne, vous devez le taper. Par exemple, si vous en avez assez de taper System.Environment.NewLine, vous pouvez faire string.format ("... {0} ... {0} ... {0}", System.Environment.NewLine), mais, dans $, vous devez le répéter. Vous ne pouvez pas faire $ "{0}" et le transmettre à string.format car $ "{0}" renvoie "0".

Sur la note de côté, j'ai lu un commentaire dans une autre copie dupliquée. Je ne pouvais pas commenter, alors, la voici. Il a dit que

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

crée plus d'un objet de chaîne. Ce n'est pas vrai en fait. Si vous faites cela sur une seule ligne, il ne crée qu'une seule chaîne et est placé dans le cache de chaînes.

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

Tous renvoient une chaîne et ne créent qu'une seule valeur dans le cache.

D'autre part:

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

Crée 4 valeurs différentes dans le cache car il existe 4 ";".

Ainsi, il sera plus facile d'écrire du code comme suit, mais vous créeriez cinq chaînes interpolées, corrigées par Carlos Muñoz:

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

Cela crée une seule chaîne dans le cache pendant que vous avez très facile à lire le code. Je ne suis pas sûr de la performance, mais, je suis sûr que MS l’optimisera si ce n’est déjà fait.

10
BoBoDev

Notez que vous pouvez également combiner les deux, ce qui est plutôt cool (bien que cela paraisse un peu étrange):

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

C'est plus pratique que string.Format et vous pouvez utiliser intellisense ici aussi.

 enter image description here

Et voici ma méthode de test:

[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
GorkemHalulu

La syntaxe $ est agréable, mais avec un inconvénient.

Si vous avez besoin de quelque chose comme un modèle de chaîne, cela est déclaré au niveau de la classe en tant que champ ... bien à un endroit comme il se doit.

Ensuite, vous devez déclarer les variables au même niveau ... ce qui n’est pas vraiment cool.

Il est beaucoup plus agréable d'utiliser la syntaxe string.Format pour ce genre de choses

class Example1_StringFormat {
 string template = $"{0} - {1}";

 public string FormatExample1() {
   string some1 = "someone";
   return string.Format(template, some1, "inplacesomethingelse");
 }

 public string FormatExample2() {
   string some2 = "someoneelse";
   string thing2 = "somethingelse";
   return string.Format(template, some2, thing2);
 }
}

L'utilisation de globals n'est pas vraiment correcte et à part ça - ça ne marche pas non plus avec les globals 

 static class Example2_Format {
 //must have declaration in same scope
 static string some = "";
 static string thing = "";
 static string template = $"{some} - {thing}";

//This returns " - " and not "someone - something" as you would maybe 
//expect
 public static string FormatExample1() {
   some = "someone";
   thing = "something";
   return template;
 }

//This returns " - " and not "someoneelse- somethingelse" as you would 
//maybe expect
 public static string FormatExample2() {
   some = "someoneelse";
   thing = "somethingelse";
   return template;
 }
}
5
Tom

L'exemple suivant met en évidence divers avantages de l'utilisation de chaînes interpolées sur string.Format() en ce qui concerne la propreté et la lisibilité. Il montre également que le code dans {} est évalué comme tout autre argument de fonction, comme si le string.Format() était appelé.

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
Pažout

Je ne sais pas comment ça marche, mais vous pouvez aussi l'utiliser pour mettre vos valeurs en évidence!

Exemple :

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

Bien sûr, vous pouvez remplacer "ça!" avec n'importe quelle variable ou quelque chose de significatif, comme vous pouvez aussi changer la tabulation.

5
Een Amok

Cela signifie une interpolation de chaîne.

Il vous protégera car il ajoute une protection de temps de compilation à l’évaluation de la chaîne.

Vous n'obtiendrez plus d'exception avec string.Format("{0}{1}",secondParamIsMissing)

5
silver

le signe $ dans la chaîne est pour la définition de la chaîne d'interpolation qui est une fonctionnalité en C # pour interpoler la chaîne est une "chaîne vraie" pouvant contenir des expressions interpolées

pour plus d'informations, voici la source de la réponse et l'exemple: https://docs.Microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated

J'espère que ça aide À partir de 2018

0
Tom Bradley