2015-10-20 61 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非常便宜。在大多數情況下,從數據庫中讀取單個變量需要花費數百倍的時間。