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?

Keith
la source
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@$ .

Keith
la source
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