wake-up-neo.com

Multiline C # interpoliertes String-Literal

C # 6 bietet Compiler-Unterstützung für interpolierte String-Literale mit Syntax:

var person = new { Name = "Bob" };

string s = $"Hello, {person.Name}.";

Dies ist ideal für kurze Zeichenfolgen. Wenn Sie jedoch eine längere Zeichenfolge erstellen möchten, muss diese in einer einzelnen Zeile angegeben werden.

Mit anderen Saitenarten können Sie:

    var multi1 = string.Format(@"Height: {0}
Width: {1}
Background: {2}",
        height,
        width,
        background);

Oder:

var multi2 = string.Format(
    "Height: {1}{0}" +
    "Width: {2}{0}" +
    "Background: {3}",
    Environment.NewLine,
    height,
    width,
    background);

Ich kann keinen Weg finden, um dies mit der String-Interpolation zu erreichen, ohne eine Zeile zu haben:

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

Mir ist klar, dass Sie in diesem Fall \r\n anstelle von Environment.NewLine (weniger portabel) verwenden können, oder Sie können es auf ein lokales Verzeichnis ziehen. Es kann jedoch Fälle geben, in denen Sie es nicht unter eine Zeile reduzieren können, ohne die semantische Stärke zu verlieren.

Ist es einfach der Fall, dass die String-Interpolation nicht für lange Strings verwendet werden soll?

Sollten wir StringBuilder nur für längere Zeichenfolgen verwenden?

var multi4 = new StringBuilder()
    .AppendFormat("Width: {0}", width).AppendLine()
    .AppendFormat("Height: {0}", height).AppendLine()
    .AppendFormat("Background: {0}", background).AppendLine()
    .ToString();

Oder gibt es etwas eleganteres?

43
Drew Noakes

Sie können $ und @ miteinander kombinieren, um ein mehrzeiliges interpoliertes String-Literal zu erhalten:

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

Quelle: Lange Zeichenketteninterpolationszeilen in C # 6 (Danke an @Ric für das Finden des Threads!)

83

Ich würde wahrscheinlich eine Kombination verwenden

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

Ich persönlich füge einfach eine andere interpolierte Zeichenfolge hinzu, indem ich die Verkettung von Zeichenketten verwende

Zum Beispiel

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

Ich finde das einfacher zu formatieren und zu lesen.

Dies hat hat einen zusätzlichen Aufwand im Vergleich zur Verwendung von $ @ "", dies wird jedoch nur in den leistungskritischsten Anwendungen sichtbar. Im Speicher sind Zeichenfolgenoperationen im Vergleich zu Daten-E/A extrem günstig. Das Lesen einer einzelnen Variablen aus der Datenbank dauert in den meisten Fällen hunderte Male länger.

1
Andrew Monteith