关于C#:长字符串插值线

Long string interpolation lines in C#6

我发现,当将字符串插值应用于现有代码基的字符串格式调用时,尽管字符串插值非常好,但考虑到通常首选的列限制,字符串对于一行来说很快变得太长。尤其是当被插值的表达式很复杂时。使用格式字符串,可以将变量列表拆分为多行。

1
2
3
var str = string.Format("some text {0} more text {1}",
    obj1.property,
    obj2.property);

有没有人有任何打破这些线的首选方法?

我想你可以做如下的事情:

1
2
var str = $"some text { obj1.property }" +
 " more text { obj2.property };


你可以把这行分成多行,但我不会说语法看起来很好。

您需要使用$@语法来使用插入的逐字字符串,并且可以在{...}参数中放置换行符,如下所示:

1
2
3
4
5
string s = $@"This is all {
    10
    } going to be one long {
    DateTime.Now
    } line."
;

上面的字符串不包含任何换行符,实际上将包含以下内容:

This is all 10 going to be one long 01.08.2015 23.49.47 line.

(注:挪威格式)

既然这么说了,我不会停止使用string.Format。在我看来,这些字符串插值表达式中的一些看起来非常好,但是更复杂的表达式开始变得非常难以阅读。考虑到除非使用FormattableString,否则代码将被编译成对string.Format的调用,我认为继续使用string.Format是有意义的。


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

1
2
var str = $@"some text { obj1.property }
     more text { obj2.property }"
;

但这会给你一个介于两者之间的NewLine角色,所以这可能不是你想要的。


虽然OP要求其他的东西,但我希望许多阅读这个问题的人会喜欢多行插入的$"",它的工作方式与@""类似。为此,请使用$@""

1
2
3
$@"Height: {height}
Width: {width}
Background: {background}"


我以重写的ToString()中的StringBuilder为例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    // return employee data
    public override string ToString()
    {
        StringBuilder buffer = new StringBuilder();
        buffer.AppendLine($"Number: {EmployeeNumber}");
        buffer.AppendLine($"Name: {EmployeeName}");
        buffer.AppendLine($"Address: {PostalAddress}");
        buffer.AppendLine($"Phone: {PhoneNumber}");
        buffer.AppendLine($"Age: {EmployeeAge}");
        buffer.AppendLine($"Gender: {EmployeeGender}");
        buffer.AppendLine($"Status: {EmployeeStatus}");
        buffer.AppendLine($"Manager: {EmployeeManager}");
        buffer.AppendLine($"Start: {EmployeeStartDate.ToShortDateString()}");
        return buffer.ToString();
    }


就是这样:

1
2
var str = $"some text { obj1.property }" +
          $" more text { obj2.property }";

注意$"..." + $"..."中的第二个$