关于.net:多行C#插值字符串文字

Multiline C# interpolated string literal

C 6提供了编译器对插入字符串文本的语法支持:

1
2
3
var person = new { Name ="Bob" };

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

这对于短字符串很好,但如果要生成更长的字符串,必须在一行上指定它?

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

1
2
3
4
5
6
    var multi1 = string.Format(@"Height: {0}
Width: {1}
Background: {2}"
,
        height,
        width,
        background);

或:

1
2
3
4
5
6
7
8
var multi2 = string.Format(
   "Height: {1}{0}" +
   "Width: {2}{0}" +
   "Background: {3}",
    Environment.NewLine,
    height,
    width,
    background);

我找不到一种方法可以通过字符串插值来实现这一点,而不需要所有的一行:

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

我知道在这种情况下,你可以用

代替Environment.NewLine(不太便携),或者把它拉到一个本地,但是在某些情况下,你不能在不失去语义强度的情况下把它减少到一行以下。

字符串插值不应该用于长字符串,这是简单的情况吗?

我们应该只使用StringBuilder串较长的串吗?

1
2
3
4
5
var multi4 = new StringBuilder()
    .AppendFormat("Width: {0}", width).AppendLine()
    .AppendFormat("Height: {0}", height).AppendLine()
    .AppendFormat("Background: {0}", background).AppendLine()
    .ToString();

还是有更优雅的东西?


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

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

来源:C 6中的长字符串插值行(感谢@ric找到线程!)


我可能会使用组合

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


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

例如

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

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

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