2015-10-20 90 views
24

C#6带来了语法插值字符串文字编译器的支持:多行C#插值字符串字面

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

还是有更优雅的东西?

+6

http://stackoverflow.com/questions/31764898/long-string-interpolation-lines-in-c6 – Ric

+0

@DmytroShevchenko,我确实考虑过这样做。不过,我不确定是否接受你的,因为我看着你从Ric发布的链接复制/粘贴[top voteed answer](http://stackoverflow.com/a/31764920/24874),然后编辑它看起来不同。这一切都在5分钟内发生,因此编辑不可见。你的回答在技术上是正确的,但我觉得你应该给予信任。我实际上想接受Ric的评论,但那不可能。 –

+0

@DrewNoakes您的问题已被标记为由Ric链接的问题的副本。里克也是标记它的人。所以没有必要为我的答案添加另一个链接的实例。如果你不同意,我会很感激你的推理。当然,我在我的答案中编辑了代码。虽然,原因不是让它看起来不同,而是要匹配你的问题中的例子。 –

回答

49

您可以结合$@在一起,以得到多插字符串文字:

string s = 
[email protected]"Height: {height} 
Width: {width} 
Background: {background}"; 

来源:Long string interpolation lines in C#6(感谢@Ric寻找线程!)

+1

我曾试图将它作为@ $(反转),但它不起作用,因此我认为它们不能组合。我没有想到以另一种方式尝试它。 – kencordero

2

我可能会使用一个组合

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

downvoter可以提供任何见解吗?我没有看到任何问题,是否有问题? – kai

+0

为了记录,我实际上赞成了你。可能会出现这种情况更具可读性的情况。我能想到的唯一不足就是它为GC创建了一些额外的对象。 –

+0

我认为在特殊情况下,只有非常有限的资源或需要追加数以千计的数据(如果不是数百万行)才是负面的。我不特别喜欢格式化的逐字字符串。它使代码文件中的文本布局负责输出的显示。我更喜欢stringbuilder,它更具表现力。 – kai

0

个人而言,我只是添加另一个插值字符串摹串联

例如

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

我觉得这是比较容易格式化和读取。

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