多行 C# 内插字符串文字

问题描述 投票:0回答:4

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

或者有更优雅的东西吗?

c# .net string multiline string-interpolation
4个回答
254
投票

你可以结合

string interpolation
$
verbatim literal
@
一起得到一个
multiline interpolated string literal

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

来源:C#6 中的长字符串插值行(感谢@Ric 找到主题!)


13
投票

我可能会使用组合

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

9
投票

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
}

解释:

  • 字符串现在由

    """
    分隔,插值由
    {{
    }}
    分隔,因为指定了两个连续的
    $
    (如果需要,您可以添加更多
    $
    "
    ,但对于报价必须使用相同的数字来打开和关闭它)。

  • 您定义开始和结束引号的行的缩进很重要!如果您使用不同数量的制表符和/或空格缩进它,编译器可能会抱怨。

  • 如果需要,您可以有 3 个以上的引号,例如

    """""
    。请注意,开始和结束引号的数量必须匹配(在这种情况下,需要 5 个开始和 5 个结束双引号来括起一个字符串)。

  • 使用这种新语法,不需要

    @
    前缀,因为您不再需要在字符串中转义双引号

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

您可以在此处找到完整文档@Microsoft


注意: 您可以在LinqPad 7(在首选项 -> 查询选项卡中,确保启用“启用 C#/F# 预览功能”)、Visual Studio 或在命令行 . DotNetFiddle 不支持新语法(目前)。 要在命令行上试用它,请使用批处理文件

CompileCS
,您可以在 链接 中找到它并像这样调用它:
compilecs /run multiline.cs
(前提是您安装了最新版本的 Roslyn)。


8
投票

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

例如

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.