声明在C#6中使用字符串插值的长字符串

我通常通过连接来包装长字符串:

Log.Debug("I am a long string. So long that I must " + "be on multiple lines to be feasible."); 

这非常有效,因为编译器处理字符串文字的连接。 我也认为这是解决这个问题最简洁的方法( 选项在这里称重 )。

这种方法适用于String.Format

 Log.Debug(String.Format("Must resize {0} x {1} image " + "to {2} x {3} for reasons.", image.Width, image.Height, resizedImage.Width, resizedImage.Height)); 

但是,我现在希望在这些情况下不再使用String.Format ,因为C#6的字符串插值更具可读性。 我担心的是,我不再有一种有效而又干净的方式来格式化长字符串。

我的问题是编译器是否能以某种方式优化类似的东西

 Log.Debug($"Must resize {image.Width} x {image.Height} image " + $"to {resizedImage.Width} x {resizedImage.Height} for reasons."); 

进入上面的String.Format等价物,或者如果有一种替代方法,我可以使用它不会低效(由于不必要的连接),同时保持我的代码干净结构(根据上面链接中提出的点)。

目前,这种优化似乎是不可能的。

这个程序:

 var name = "Bobby Tables"; var age = 8; String msg = $"I'm {name} and" + $" I'm {age} years old"; 

编译好像你写的:

 var name = "Bobby Tables"; var age = 8; String msg = String.Concat(String.Format("I'm {0} and", name), String.Format(" I'm {0} years old", age)); 

你看到摆脱Concat的困难 – 编译器重新编写了我们的插值文字来使用String.Format期望的索引格式化程序,但每个字符串必须从0开始对其参数进行编号。天真连接它们会导致它们插入name 。 为了使其正确运行,必须在$ parser的调用之间保持状态,以便将第二个字符串重新格式化为" I'm {1} years old" 。 或者,编译器可以尝试对字符串文字的连接应用相同类型的分析。 我认为这将是一个合法的优化,即使字符串插值可能有副作用,但我不会感到惊讶,如果事实certificate有一个角落情况下内插字符串连接改变了程序行为。 两种声音都不可能,特别是考虑到逻辑已经存在以检测字符串文字的类似条件,但我可以看到为什么这个function没有进入第一个版本。

我会以你认为最干净,最可读的方式编写代码,而不用担心微观效率低下,除非它们被certificate是一个问题。 关于代码主要供人类理解的古老说法在这里举行。

也许它不像用+那样可读,但无论如何,它是可能的。 你只需要在{}之间分开:

 Log.Debug($@"Must resize {image.Width} x {image.Height} image to { resizedImage.Width} x {resizedImage.Height} for reasons."); 

SO的着色脚本不能很好地处理这种语法,但C#编译器确实如此;-)

在HTML中使用此字符串的特殊情况下(或使用任何解析器解析多个空格无关紧要),我建议您使用@$""字符串(逐字插入字符串)例如:

 $@"some veeeeeeeeeeery long string {foo} whatever {bar}" 

在c#6.0中:

 var planetName = "Bob"; var myName = "Ford"; var formattedStr = $"Hello planet {planetName}, my name is {myName}!"; // formattedStr should be "Hello planet Bob, my name is Ford!" 

然后与stringbuilder连接:

 StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append(formattedStr); // Then add the strings you need 

在stringbuilder中添加更多字符串…..