.net 多行C#内插字符串文字

2skhul33  于 2022-11-19  发布在  .NET
关注(0)|答案(4)|浏览(174)

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

还是有更优雅的?

xj3cbfub

xj3cbfub1#

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

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

来源:Long string interpolation lines in C#6(感谢@Ric找到这个帖子!)

ahy6op9u

ahy6op9u2#

我可能会用一个组合

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

2wnc66cl3#

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

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

我发现那更容易格式化和阅读。
与使用$@”“相比,这 * 将 * 会有额外的开销,但只有在性能要求最高的应用程序中,这一点才会明显。与数据I/O相比,内存中的字符串操作非常便宜。在大多数情况下,从数据库阅读单个变量所需的时间要长数百倍。

vatpfxk5

vatpfxk54#

由于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个右双引号将字符串括起来)。

这大大简化了多行字符串的声明。
你可以找到一个full documentation here @ Microsoft

**注意:**您可以在LinqPad 7(在Preferences -〉Query选项卡中,确保启用了“Enable C#/F# preview features”)、Visual Studiocommand line中试用它。DotNetFiddle(目前)还不支持新语法。要在命令行中试用它,请使用the link中提供的批处理文件CompileCS,并如下调用它:compilecs /run multiline.cs(前提是您已安装最新版本的Roslyn)。

相关问题