多行C#插值字符串文字

时间:2015-10-20 12:23:14

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

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

还是有更优雅的东西?

3 个答案:

答案 0 :(得分:90)

您可以将$@组合在一起以获取多行插值字符串文字:

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

来源:Long string interpolation lines in C#6(感谢@Ric找到线程!)

答案 1 :(得分:5)

我可能会使用组合

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

答案 2 :(得分:1)

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

例如

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

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

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