多行 C # 内插字符串文字

C # 6带来了编译器对带语法的内插字符串文字的支持:

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


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

This is great for short strings, but if you want to produce a longer string must it be specified on a single line?

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

    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();

还是有更优雅的东西?

63334 次浏览

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

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

来源: C # 6中的长字符串插值线(感谢 @ Ric找到了这个帖子!)

我可能会用密码

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

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

比如说

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

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

与使用 $@ “”相比,这个 威尔具有额外的开销,但只有在性能最关键的应用程序中才会引起注意。在内存字符串运算中,与数据 I/o 相比,读取数据库中的一个变量在大多数情况下要花费数百倍的时间。

因为 C # 11你可以这样做(文件 multiline.cs) :

using System;
public class Program
{
public static void Main()
{
var multiLineStr =
$$"""
{
"Color" : "Blue",
"Thickness" : \{\{1 + 1}}
}
""";
Console.WriteLine(multiLineStr);
}
}

现在字符串变量 multiLineStr包含:

{
"Color" : "Blue",
"Thickness" : 2
}

Explanation:

  • 字符串现在用 """分隔,插值用 \{\{}}分隔,因为指定了两个连续的 $(如果需要,你可以添加更多的 $",但是对于引号,你必须使用相同的数字来打开和关闭它)。

  • 定义开始和结束引号的行的 压痕引号 事项!如果用不同数量的制表符和/或空格缩进,编译器可能会抱怨。

  • 如果需要,你可以有3个以上的报价,例如 """""。请注意,开始和结束引号的数量必须匹配(在这种情况下,需要5个开始和5个结束双引号来包围一个字符串)。

这大大简化了多行字符串的声明。

你可以找到 完整文档@Microsoft


注意: 您可以在 LinqPad 7(在 Preferences-> Query 选项卡中,确保启用了“ Enable C #/F # 预览特性”)、 Visual Studio命令行中试用它。DotNetFiddle 还不支持新语法。 要在命令行上尝试使用它,可以使用在 链接中找到的批处理文件 CompileCS并调用它,如: compilecs /run multiline.cs(假设您已经安装了 Roslyn 的最新版本)。