2015-10-20 10 views
24

C# 6 bringt Support-Compiler für interpolierte Stringliterale mit Syntax:mehrzeilige C# interpoliert Stringliteral

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

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

Dies ist ideal für kurze Strings, aber wenn man eine längere Schnur produzieren will, muss es auf einem einzelnen angegeben werden Linie?

mit anderen Arten von Zeichenketten 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 keine Möglichkeit, dies zu erreichen, mit String-Interpolation, ohne dass es eine eine Zeile finden:

Ich weiß, dass Sie in diesem Fall \r\n anstelle vonverwenden könnten(weniger portabel), oder ziehen Sie es zu einem lokalen, aber es wird Fälle geben, in denen Sie es nicht unter einer Linie reduzieren können, ohne semantische Stärke zu verlieren.

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

Sollten wir nur mit String StringBuilder für längere Strings?

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?

+6

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

+0

@DmytroShevchenko, habe ich darüber nachgedacht, so zu tun. Allerdings war ich mir nicht sicher, ob ich deine annehmen sollte, da ich sah, wie du die [bestgewählte Antwort] (http://stackoverflow.com/a/31764920/24874) von dem Link, den Ric gepostet hat, kopiere/einfügen und dann anders editieren . Das alles geschah innerhalb von 5 Minuten, so dass die Änderungen nicht sichtbar sind. Ihre Antwort ist technisch korrekt, aber ich hatte das Gefühl, dass Sie mir Anerkennung geben sollten. Ich würde Rics Kommentar gerne annehmen, aber das ist nicht möglich. –

+0

@DrewNoakes Ihre Frage wurde als ein Duplikat der von Ric verknüpften Frage markiert. Ric war derjenige, der es auch markiert hat. Es ist also nicht nötig, noch eine weitere Instanz dieses Links zu meiner Antwort hinzuzufügen. Wenn Sie nicht zustimmen, würde ich Ihre Argumentation schätzen. Und natürlich habe ich den Code in meiner Antwort bearbeitet. Der Grund war jedoch nicht, dass es anders aussieht, sondern dass es dem Beispiel in Ihrer Frage entspricht. –

Antwort

49

Sie $ und @ zusammen kombinieren können, um ein mehrzeiliges interpoliert Stringliteral zu erhalten:

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

Quelle: Long string interpolation lines in C#6 (Dank @Ric für den Faden zu finden!)

+1

Ich hatte dies als @ $ (umgekehrt) versucht und es hat nicht funktioniert, so dass ich dachte, sie könnten nicht kombiniert werden. Es kam mir nicht in den Sinn, es anders zu versuchen. – kencordero

2

ich wahrscheinlich eine Kombination verwenden würde,

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

könnte der downvoter irgendwelche einblicke geben? Ich sehe keine Probleme damit, gibt es ein Problem? – kai

+0

Für den Rekord habe ich dich tatsächlich aufgestuft. Es kann Fälle geben, in denen dies besser lesbar ist. Das einzige Negative, das mir einfällt, ist, dass es ein paar zusätzliche Objekte für den GC schafft. –

+0

Ich denke, das ist nur ein negatives in Ausnahmefällen, wo Sie sehr begrenzte Ressourcen haben oder Tausende, wenn nicht Millionen von Zeilen anhängen müssen. Ich mag nicht besonders wörtliche Zeichenfolgen zum Formatieren. Es macht das Layout des Textes in der Code-Datei verantwortlich für das Aussehen der Ausgabe. Ich bevorzuge Stringbuilder, es ist expressiver. – kai

0

Persönlich, ich füge nur eine andere interpolierte Zeichenfolge mit Strin g Verkettung

Zum Beispiel

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

Ich finde, dass ist einfacher zu formatieren und zu lesen.

Diese wird haben zusätzliche Overhead im Vergleich zu der Verwendung $ @ "", aber nur in den meisten leistungskritischen Anwendungen wird dies bemerkbar sein. Im Speicher sind String-Operationen im Vergleich zu Daten-I/O extrem günstig. Das Lesen einer einzelnen Variable aus der db dauert in den meisten Fällen hunderte Male länger.