如何将逐字字符串与插值一起使用?


133

在C#6中,有一个新功能:内插字符串。

这些使您可以将表达式直接放入代码中,而不是依赖索引:

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

成为:

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

但是,我们使用逐字字符串(主要是SQL语句)在多行中有很多字符串,如下所示:

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

将它们恢复为常规字符串似乎很麻烦:

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

如何同时使用逐字和内插字符串?


3
如果确实是关于SQL字符串的,那么是否有任何理由不使用参数化查询呢?
svick

1
“我们使用逐字字符串(主要是SQL语句)在多行中有很多字符串”听起来像您有很多启用SQL注入攻击的SQL字符串。
Cetin Basoz

1
@svick我们是,用户输入的所有内容均已参数化。但是,我们仍然大量使用动态SQL,因为我们在代码中为实体动态创建SQL。
基思

1
@CetinBasoz我们没有-所有用户输入均已参数化。在很多情况下,您都有动态SQL-例如LINQ或任何其他对象映射框架。
基思

Answers:


194

您可以将$@前缀都应用于同一字符串:

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

自从在C#6引入以来,内插逐字字符串必须以标记开头$@但是从C#8开始,您可以使用$@@$


57
相反的(@$"...")不起作用,这使我到了这里。
Sinatr '75

12
@Sinatr是的,必须按此$@"..."顺序。
基思

36
$@何时@$不起作用的事实,在您考虑时完全有道理。当我对此感到困惑时(当我开始使用此语法时经常发生),我总是对自己说:“插入此逐字字符串”,原因恰恰相反。
Heki's

1
@RayLuo并不是真的,但是鉴于各种.NET JSON序列化器的发展速度,您可能不应该直接对JSON进行编码。
基思(Keith)

1
如果将二重奏应用于现有对象const string,请删除const
bvj
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.