Comment utilisez-vous des chaînes textuelles avec interpolation?


133

En C # 6, il y a une nouvelle fonctionnalité: les chaînes interpolées.

Celles-ci vous permettent de placer des expressions directement dans le code, plutôt que de vous fier aux index:

string s = string.Format("Adding \"{0}\" and {1} to foobar.", x, this.Y());

Devient:

string s = $"Adding \"{x}\" and {this.Y()} to foobar.";

Cependant, nous avons beaucoup de chaînes sur plusieurs lignes en utilisant des chaînes verbatim (principalement des instructions SQL) comme ceci:

string s = string.Format(@"Result...
Adding ""{0}"" and {1} to foobar:
{2}", x, this.Y(), x.GetLog());

Les restaurer en chaînes régulières semble compliqué:

string s = "Result...\r\n" +
$"Adding \"{x}\" and {this.Y()} to foobar:\r\n" +
x.GetLog().ToString();

Comment utiliser ensemble des chaînes textuelles et interpolées?


3
S'il s'agit vraiment de chaînes SQL, y a-t-il une raison pour laquelle vous n'utilisez pas à la place des requêtes paramétrées?
— svick

1
«Nous avons beaucoup de chaînes sur plusieurs lignes utilisant des chaînes textuelles (principalement des instructions SQL)» semble que vous avez beaucoup de chaînes SQL permettant les attaques par injection SQL.
— Cetin Basoz

1
@svick nous sommes, toutes les entrées utilisateur sont paramétrées. Cependant, nous utilisons toujours beaucoup le SQL dynamique, car nous créons dynamiquement du SQL pour nos entités dans le code.
— Keith

1
@CetinBasoz nous ne le faisons pas - toutes les entrées utilisateur sont paramétrées. Il existe de nombreuses circonstances dans lesquelles vous avez du SQL dynamique - par exemple LINQ ou tout autre framework de mappage d'objets.
— Keith

Réponses:


195

Vous pouvez appliquer les deux préfixes $et @à la même chaîne:

string s = $@"Result...
Adding ""{x}"" and {this.Y()} to foobar:
{x.GetLog()}";

Depuis leur introduction en C # 6 , les chaînes verbatim interpolées devaient commencer par les jetons $@, mais à partir de C # 8, vous pouvez utiliser soit $@ou@$ .


57
Opposite ( @$"...") ne fonctionne pas, ce qui m'amène ici.
— Sinatr

12
@Sinatr ouais, ça doit être $@"..."dans cet ordre.
— Keith

36
Le fait que cela $@fonctionne quand ce @$n'est pas le cas est parfaitement logique quand on y pense. Quand je suis confus à ce sujet, ce qui est arrivé fréquemment lorsque j'ai commencé à utiliser cette syntaxe, je me suis toujours dit: "Interpoler cette chaîne textuelle" car le contraire n'aurait pas de sens.
— Heki

1
@RayLuo pas vraiment, mais étant donné la rapidité avec laquelle divers serialisers .NET JSON sont devenus, vous ne devriez probablement pas encoder directement JSON de toute façon.
— Keith

1
Si vous appliquez le duo à un existant const string, supprimez le fichier const.
— bvj
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.