多行C#内插字符串文字


77

C#6通过以下语法为内插字符串文字带来了编译器支持:

var person = new { Name = "Bob" };

string s = $"Hello, {person.Name}.";

这对于短字符串来说非常有用,但是如果要生成更长的字符串,必须在一行上指定它吗?

使用其他类型的字符串,您可以:

    var multi1 = string.Format(@"Height: {0}
Width: {1}
Background: {2}",
        height,
        width,
        background);

要么:

var multi2 = string.Format(
    "Height: {1}{0}" +
    "Width: {2}{0}" +
    "Background: {3}",
    Environment.NewLine,
    height,
    width,
    background);

如果没有一行内容,我无法找到一种通过字符串插值实现此目标的方法:

var multi3 = $"Height: {height}{Environment.NewLine}Width: {width}{Environment.NewLine}Background: {background}";

我意识到,在这种情况下,您可以使用(不太便携)\r\n代替Environment.NewLine它,或者将其拉到本地,但是在某些情况下,您不能将其减少到一行以下而又不会失去语义强度。

只是字符串不应该用于长字符串的情况?

我们应该只使用StringBuilder更长的字符串吗?

var multi4 = new StringBuilder()
    .AppendFormat("Width: {0}", width).AppendLine()
    .AppendFormat("Height: {0}", height).AppendLine()
    .AppendFormat("Background: {0}", background).AppendLine()
    .ToString();

还是有一些更优雅的东西?



@DmytroShevchenko,我确实考虑过这样做。但是,我不确定您是否接受您的意见,因为我看到您从Ric发布的链接中复制/粘贴了投票最多的答案,然后对其进行编辑以使其看起来有所不同。所有操作都在5分钟内完成,因此看不到修改。从技术上来说,您的回答是正确的,但是我觉得您应该功劳不错。我实际上想接受Ric的评论,但这是不可能的。
Drew Noakes

@DrewNoakes您的问题已被标记为Ric链接的问题的重复项。Ric也是标记它的人。因此,无需在我的答案中添加该链接的另一个实例。如果您不同意,我将不胜感激。当然,我在答案中编辑了代码。虽然,这样做的原因不是使它看起来不同,而是为了与问题中的示例匹配。
Dmytro Shevchenko

@DmytroShevchenko看到网站的页脚:根据cc by-sa 3.0授权的用户贡献,且需要注明出处
Drew Noakes 2015年

2
投票重新开放。假定的重复问题提出了不同和相反的要求(他们想要在源代码中换行,但不希望字符串)。主持人,在关闭问题之前,请仔细阅读问题!
上校恐慌

Answers:


148

您可以将$@组合在一起以获得多行插值字符串文字:

string s =
$@"Height: {height}
Width: {width}
Background: {background}";

来源:C#6中的长字符串插值线(感谢@Ric查找线程!)


6
我曾尝试将其作为@ $(反向)使用,但它不起作用,因此我认为它们无法合并。我没有想到以其他方式尝试它。
kencordero

2
从C#8.0开始,可以按任何顺序使用$和@标记:$ @“ ...”和@ $“ ...”都是有效的内插逐字字符串。在早期的C#版本中,$令牌必须出现在@令牌之前。
hal9000

9

我可能会组合使用

var builder = new StringBuilder()
    .AppendLine($"Width: {width}")
    .AppendLine($"Height: {height}")
    .AppendLine($"Background: {background}");

下降投票者能否提供任何见解?我没有发现任何问题,有问题吗?
2015年

根据记录,我实际上赞成您。在某些情况下,这更具可读性。我唯一想到的缺点是,它正在为GC创建一些额外的对象。
Drew Noakes

1
我认为这在某些情况下是不利的,在这种情况下,您的资源非常有限,或者需要追加数千甚至不是几百万行。我不太喜欢逐字字符串进行格式化。它使代码在文件中的布局负责输出的外观。我更喜欢stringbuilder,它更具表现力。
2015年

我同意逐字字符串的格式有点难看。String.Concat在这里也可能是一个选择。
Drew Noakes

绝对比逐字更喜欢concat。关于stringbuilder的好处是,它可以为您做换行。我也许对其中任何一个都可以。
2015年

3

就个人而言,我只是使用字符串连接添加了另一个内插字符串

例如

var multi  = $"Height     : {height}{Environment.NewLine}" +
             $"Width      : {width}{Environment.NewLine}" +
             $"Background : {background}";

我发现这更容易格式化和阅读。

与使用$ @“”相比,这产生额外的开销,但是只有在性能最关键的应用程序中,这才是显而易见的。与数据I / O相比,内存字符串操作非常便宜。在大多数情况下,从数据库读取单个变量将花费数百倍的时间。

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.