多行 C# 插值字符串文字

Posted

技术标签:

【中文标题】多行 C# 插值字符串文字【英文标题】:Multiline C# interpolated string literal 【发布时间】:2016-01-19 02:37:07 【问题描述】:

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: 10" +
    "Width: 20" +
    "Background: 3",
    Environment.NewLine,
    height,
    width,
    background);

如果没有一行代码,我找不到通过字符串插值实现这一点的方法:

var multi3 = $"Height: heightEnvironment.NewLineWidth: widthEnvironment.NewLineBackground: 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();

或者有什么更优雅的吗?

【问题讨论】:

***.com/questions/31764898/… @DmytroShevchenko,我确实考虑过这样做。但是,当我看到您从 Ric 发布的链接中复制/粘贴 top voted answer 时,我不确定是否接受您的,然后对其进行编辑以使其看起来有所不同。这一切都发生在 5 分钟内,因此编辑不可见。您的回答在技术上是正确的,但我觉得您应该给予信任。我其实很想接受 Ric 的评论,但那是不可能的。 @DrewNoakes 您的问题已被标记为与 Ric 链接的问题重复。 Ric 也是标记它的人。因此,无需在我的答案中添加该链接的另一个实例。如果您不同意,我将不胜感激您的推理。当然,我在答案中编辑了代码。虽然,原因不是让它看起来不同,而是为了匹配你问题中的例子。 @DmytroShevchenko 查看该网站的页脚:根据 cc by-sa 3.0 许可的用户贡献,需要注明出处 投票重新开放。假定的重复问题提出了一些不同且相反的问题(他们想要源代码中的换行符,而不是字符串)。版主,请在关闭问题之前仔细阅读问题! 【参考方案1】:

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

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

来源:Long string interpolation lines in C#6(感谢@Ric 找帖!)

【讨论】:

我曾以@$ (反转)的形式尝试过,但它不起作用,所以我认为它们无法合并。我没有想到要换一种方式尝试。 从 C# 8.0 开始,您可以按任意顺序使用 $ 和 @ 标记:$@"..." 和 @$"..." 都是有效的内插逐字字符串。在早期的 C# 版本中,$ 标记必须出现在 @ 标记之前。【参考方案2】:

我可能会使用一个组合

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

【讨论】:

投反对票的人能否提供任何见解?我没有看到任何问题,有问题吗? 为了记录,我实际上支持你。在某些情况下,这更具可读性。我能想到的唯一负面因素是它为 GC 创建了一些额外的对象。 我认为这仅在资源非常有限或需要附加数千行(如果不是数百万行的话)的特殊情况下是负面的。我不特别喜欢用于格式化的逐字字符串。它使代码文件中的文本布局负责输出的外观。我更喜欢 stringbuilder,它更具表现力。 我同意逐字字符串的格式有点难看。 String.Concat 也可能是这里的一个选项。 绝对喜欢 concat 而不是逐字记录。 stringbuilder 的好处是它会为您处理换行符。不过,我可能对任何一个都可以。【参考方案3】:

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

例如

var multi  = $"Height     : heightEnvironment.NewLine" +
             $"Width      : widthEnvironment.NewLine" +
             $"Background : background";

我发现它更易于格式化和阅读。

与使用 $@" " 相比,这有额外的开销,但只有在性能最关键的应用程序中才会注意到这一点。与数据 I/O 相比,内存中的字符串操作非常便宜。在大多数情况下,从数据库中读取单个变量需要花费数百倍的时间。

【讨论】:

以上是关于多行 C# 插值字符串文字的主要内容,如果未能解决你的问题,请参考以下文章

C#多行多双引号字符串

在 C# 中使用 XML 文字?

C#中字符串插值内的字符串插值导致编译器错误[重复]

在编译字符串插值实例时,Coffeescript是否始终使用ES6模板文字?

C# 10 新特性 —— 插值字符串优化

对 C# 6.0 中的字符串插值感到困惑 [重复]