C#6 中的长字符串插值行
Long string interpolation lines in C#6
我发现虽然字符串插值在应用于我现有代码库的字符串格式调用时非常好,但考虑到通常首选的列限制,字符串很快变得对一行来说太长。特别是当被插值的表达式很复杂时。使用格式字符串,您有一个变量列表,您可以将其拆分为多行。
var str = string.Format("some text {0} more text {1}",
obj1.property,
obj2.property);
有没有人有任何首选的方法来分解这些行?
我想你可以这样做:
var str = $"some text { obj1.property }" +
$" more text { obj2.property };
您可以将 $
和 @
组合在一起以获得字符串插值和多行字符串文字:
var str = $@"some text { obj1.property }
more text { obj2.property }";
但这会给你一个 NewLine
字符,所以它可能不是你想要的。
您可以将一行分成多行,但我不会说语法看起来更漂亮了。
您需要使用 $@
语法来使用内插的 verbatim 字符串,并且您可以在 {...}
参数中放置换行符,如下所示:
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
。
就是这样:
var str = $"some text { obj1.property }" +
$" more text { obj2.property }";
注意 $"..." + $"..."
中的第二个 $
虽然 OP 要求其他东西,但我希望许多阅读此问题的人会喜欢多行插值 $""
,其工作方式类似于 @""
。为此,请使用 $@""
$@"Height: {height}
Width: {width}
Background: {background}"
我在覆盖的 ToString() 中使用了 StringBuilder 作为示例。
// 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();
}
我发现虽然字符串插值在应用于我现有代码库的字符串格式调用时非常好,但考虑到通常首选的列限制,字符串很快变得对一行来说太长。特别是当被插值的表达式很复杂时。使用格式字符串,您有一个变量列表,您可以将其拆分为多行。
var str = string.Format("some text {0} more text {1}",
obj1.property,
obj2.property);
有没有人有任何首选的方法来分解这些行?
我想你可以这样做:
var str = $"some text { obj1.property }" +
$" more text { obj2.property };
您可以将 $
和 @
组合在一起以获得字符串插值和多行字符串文字:
var str = $@"some text { obj1.property }
more text { obj2.property }";
但这会给你一个 NewLine
字符,所以它可能不是你想要的。
您可以将一行分成多行,但我不会说语法看起来更漂亮了。
您需要使用 $@
语法来使用内插的 verbatim 字符串,并且您可以在 {...}
参数中放置换行符,如下所示:
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
。
就是这样:
var str = $"some text { obj1.property }" +
$" more text { obj2.property }";
注意 $"..." + $"..."
$
虽然 OP 要求其他东西,但我希望许多阅读此问题的人会喜欢多行插值 $""
,其工作方式类似于 @""
。为此,请使用 $@""
$@"Height: {height}
Width: {width}
Background: {background}"
我在覆盖的 ToString() 中使用了 StringBuilder 作为示例。
// 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();
}