C#6中的长字符串插值线


134

我发现,虽然将字符串插值应用于我现有代码库的字符串Format调用确实非常好,但考虑到通常首选的列限制,字符串对于单行来说很快就会变得太长。尤其是当要插入的表达式很复杂时。使用格式字符串,您可以获得一个可以分成多行的变量列表。

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

有人有打破这些界限的偏爱方法吗?

我想你可以做这样的事情:

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

1
以我的经验,最好避免插值复杂的表达式。而是在这种情况下提取一个变量。如果这样做,并且在字符串中的换行符分开的地方,通常就可以了。
markijbema

2
我对这个问题感到困惑。我只想要一条$""像这样的多行@""
上校恐慌

2
Panic上校,问题是询问如何拆分较长的内插线,以便在不将换行符引入字符串文字本身的情况下,不违反列宽要求。$ @“”很棒,但是引入的任何换行符都将在字符串文字中。
耶利米·高迪

4
危险:$"some text { obj1.property }" + " more text { obj2.property }";没有按照您认为的做。只有该表达式的前半部分是插值字符串;然后将其与插值字符串文字连接起来" more text { obj2.property }"
-bacar,

1
为了支持\ t \ r \ n的$ @看到问题stackoverflow.com/questions/51991713/...
M.Hassan

Answers:


198

可以将行分成多行,但我不会说语法看起来再好不过了。

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

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

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

这是全部10条,将是一条长长的01.08.2015 23.49.47行。

(请注意,挪威格式)

现在,话虽如此,我不会停止使用string.Format。在我看来,这些字符串插值表达式中的某些看上去确实不错,但更复杂的表达式开始变得很难阅读。考虑到除非您使用FormattableString,否则String.Format无论如何代码都将被编译为对调用的调用,我想说的是继续String.Format进行有意义的工作。


肯定的答案。我很确定也FormattableString可以打个电话String.Format
Alex Booker

8
这个答案帮助我弄清楚了该如何做相反的事情。感谢您的$@""语法!
Bobson,2015年

@AlexBooker比这更复杂。您不能这样做,FormattableString.Invarian($"Hello {name}" + \n "are you the owner of {pet}?");因为它将两个插值的字符串合并为一个简单的字符串。
ANeves

内插逐字字符串应尊重换行和制表符。在C#交互式窗口中输入以下内容,结果字符串将被格式化:> var name = "Simon"; var templateName = "How to interpolate a verbatim string"; var now = DateTime.UtcNow;. var output = $@"Hi {name}, This template is a demo of {templateName}. It was ran at {now.ToString("o")}"; > output。输出是"Hi Simon,\r\nThis template is a demo of How to interpolate a verbatim string.\r\n\r\nIt was ran at 2020-01-24T15:49:35.6678353Z"
Enzoaeneas

1
@Enzoaeneas我认为您在注释中高估了格式支持,但我理解并同意您的发言。
Lasse V. Karlsen

61

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

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

但这会使您NewLine介于两者之间,因此可能不是您想要的。


3
但是@确实不将换行符放入文字中吗?
耶利米·高迪

5
是的 更新了我的回答以明确地说出来。
MarcinJuraszek

不仅是新行,而且是新行的初始选项卡。为了$@"在Visual Studio中使用时正确描述实际的字符串格式,您必须从文本编辑器的最左端开始每行。
GDS

使用此解决方案,您不能在字符串中使用例如\ r和\ n
JohanFranzén19年

22

虽然OP问别的东西,我希望很多人阅读这个问题想多行插入$""该作品一样@""。为此,请使用$@""

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

3
他不希望在输出中使用换行符,而只希望将代码本身换行包装
Martin Capodici

7
他清楚地表明,此答案适用于希望使用字符串插值语法处理多行字符串的观众。
布兰登·

2

就是这个:

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

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


18
请注意,这将对String.Format进行两次调用,并且还将在内存中创建三个字符串(A侧,B侧和A + B)
Kevin Kalitowski

1
这是否会阻止您FormattableString在连接的字符串上使用强制类型转换?
宾基

4
在当今的许多实现中,在具有Gb内存的GHz CPU上运行,额外的调用和额外的字符串不会给您带来性能问题。例如,使用O(n2)算法会导致性能问题。我认为不赞成这个人是不公平的。
约翰·弗朗兹(JohanFranzén),

1

我以重写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();
    }

那为什么不呢buffer.AppendFormat("{0}Number: {1}", Environment.NewLine, EmployeeNumber);
TS
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.