two - 多行C#插值字符串文字




template string c# (2)

C#6為內插字符串文字帶來了編譯器支持,語法如下:

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

還是有更優雅的東西?


就個人而言,我只是使用字符串連接添加另一個插值字符串

例如

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

我發現格式化和閱讀更容易。

與使用$ @“”相比,這產生額外的開銷,但只有在大多數性能關鍵的應用程序中,這才會引人注目。 在內存中,字符串操作與數據I / O相比非常便宜。 在大多數情況下,從數據庫中讀取單個變量將花費數百倍的時間。








string-interpolation