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

标签: c# .net string multiline string-interpolation


【解决方案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     : {height}{Environment.NewLine}" +
             $"Width      : {width}{Environment.NewLine}" +
             $"Background : {background}";

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

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

【讨论】:

    猜你喜欢
    • 2011-10-19
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    相关资源
    最近更新 更多