多行 C# 内插字符串文字

Multiline C# interpolated string literal

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

或者有更优雅的东西吗?

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

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

来源: (Thanks to @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 相比,内存中的字符串操作极其便宜。在大多数情况下,从数据库读取单个变量将花费数百倍的时间。