多行 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# 插值字符串文字的主要内容,如果未能解决你的问题,请参考以下文章