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();
还是有更优雅的?
4条答案
按热度按时间xj3cbfub1#
可以将
$
和@
组合在一起,以获得多行插值字符串文字:来源:Long string interpolation lines in C#6(感谢@Ric找到这个帖子!)
ahy6op9u2#
我可能会用一个组合
2wnc66cl3#
就我个人而言,我只是使用字符串连接添加另一个插值字符串
比如说
我发现那更容易格式化和阅读。
与使用$@”“相比,这 * 将 * 会有额外的开销,但只有在性能要求最高的应用程序中,这一点才会明显。与数据I/O相比,内存中的字符串操作非常便宜。在大多数情况下,从数据库阅读单个变量所需的时间要长数百倍。
vatpfxk54#
由于C# 11,您可以这样做(文件
multiline.cs
):现在,字符串变量
multiLineStr
包含:说明:
"""
分隔,插值由{{
和}}
分隔,因为指定了两个连续的$
(如果需要,可以添加更多的$
或"
,但对于引号,您必须使用相同的数字来开始和结束它)。"""""
。请注意,左引号和右引号的数量必须匹配(在本例中,需要5个左双引号和5个右双引号将字符串括起来)。这大大简化了多行字符串的声明。
你可以找到一个full documentation here @ Microsoft。
**注意:**您可以在LinqPad 7(在Preferences -〉Query选项卡中,确保启用了“Enable C#/F# preview features”)、Visual Studio或command line中试用它。DotNetFiddle(目前)还不支持新语法。要在命令行中试用它,请使用the link中提供的批处理文件
CompileCS
,并如下调用它:compilecs /run multiline.cs
(前提是您已安装最新版本的Roslyn)。