Lange String-Interpolationslinien in C # 6


134

Ich habe festgestellt, dass die Zeichenfolgeninterpolation zwar sehr gut ist, wenn sie auf die Zeichenfolgenformataufrufe meiner vorhandenen Codebasis angewendet wird. Angesichts der allgemein bevorzugten Spaltenbeschränkung wird die Zeichenfolge jedoch schnell zu lang für eine einzelne Zeile. Besonders wenn die zu interpolierenden Ausdrücke komplex sind. Mit einer Formatzeichenfolge haben Sie eine Liste von Variablen, die Sie in mehrere Zeilen aufteilen können.

var str = string.Format("some text {0} more text {1}",
    obj1.property,
    obj2.property);

Hat jemand ein bevorzugtes Mittel, um diese Linien aufzubrechen?

Ich nehme an, Sie könnten so etwas tun:

var str = $"some text { obj1.property }" +
  " more text { obj2.property };

1
Nach meiner Erfahrung ist es besser, die Interpolation komplexer Ausdrücke zu vermeiden. Extrahieren Sie in diesem Fall lieber eine Variable. Wenn Sie dies tun und dort aufbrechen, wo Sie Zeilenumbrüche in Ihren Zeichenfolgen haben, passt dies normalerweise gut.
Markijbema

2
Diese Frage verwirrt mich. Ich möchte nur eine Multiline $"", die funktioniert wie@""
Colonel Panic

2
Colonel Panic, die Frage lautet, wie lange Interpolationslinien aufgelöst werden können, damit die Anforderungen an die Spaltenbreite nicht verletzt werden, ohne Zeilenvorschübe in das Zeichenfolgenliteral selbst einzufügen. $ @ "" ist großartig, aber alle darin eingeführten Zeilenumbrüche werden im String-Literal angezeigt.
Jeremiah Gowdy

4
Gefahr: $"some text { obj1.property }" + " more text { obj2.property }";tut nicht das, was Sie zu glauben scheinen. Nur die erste Hälfte dieses Ausdrucks ist eine interpolierte Zeichenfolge. es wird dann mit dem nicht interpolierten String-Literal verkettet" more text { obj2.property }"
bacar

1
Zur Unterstützung von \ t \ r \ n in $ @ siehe die Frage stackoverflow.com/questions/51991713/…
M.Hassan

Antworten:


198

Sie können die Zeile in mehrere Zeilen aufteilen, aber ich würde nicht sagen, dass die Syntax nicht mehr gut aussieht.

Sie müssen die $@Syntax verwenden, um eine interpolierte wörtliche Zeichenfolge zu verwenden, und Sie können Zeilenumbrüche {...}wie folgt in die Parameter einfügen :

string s = $@"This is all {
    10
    } going to be one long {
    DateTime.Now
    } line.";

Die obige Zeichenfolge enthält keine Zeilenumbrüche und enthält tatsächlich folgenden Inhalt:

Dies ist alles 10 wird eine lange 01.08.2015 23.49.47 Zeile sein.

(Hinweis, norwegisches Format)

Nun, nachdem ich das gesagt habe, würde ich nicht aufhören zu benutzen string.Format. Meiner Meinung nach sehen einige dieser Zeichenfolgeninterpolationsausdrücke wirklich gut aus, aber komplexere Ausdrücke werden sehr schwer zu lesen. In Anbetracht dessen, dass FormattableStringder Code , sofern Sie ihn nicht verwenden , String.Formatohnehin zu einem Aufruf kompiliert wird, würde ich sagen, machen Sie weiter, String.Formatwo es Sinn macht.


Solide Antwort. Ich bin mir ziemlich sicher FormattableString, dass es auch auf einen Anruf String.Formatankommt.
Alex Booker

8
Diese Antwort half mir herauszufinden, wie ich genau das Gegenteil davon tun kann. Danke für die $@""Syntax!
Bobson

@AlexBooker Es ist komplexer als das. Sie können dies nicht tun, FormattableString.Invarian($"Hello {name}" + \n "are you the owner of {pet}?");da die beiden interpolierten Zeichenfolgen zu einer einzigen einfachen Zeichenfolge zusammengeführt werden.
Aneves

Zeilenumbrüche und Tabulatoren werden in interpolierten wörtlichen Zeichenfolgen berücksichtigt. Geben Sie Folgendes in das interaktive C # -Fenster ein, und die resultierende Zeichenfolge wird formatiert: > var name = "Simon"; var templateName = "How to interpolate a verbatim string"; var now = DateTime.UtcNow;. var output = $@"Hi {name}, This template is a demo of {templateName}. It was ran at {now.ToString("o")}"; > output. Die Ausgabe ist"Hi Simon,\r\nThis template is a demo of How to interpolate a verbatim string.\r\n\r\nIt was ran at 2020-01-24T15:49:35.6678353Z"
Enzoaeneas

1
@Enzoaeneas Ich denke, Sie haben die Formatierungsunterstützung in Kommentaren überbewertet, aber ich verstehe und stimme dem zu, was Sie sagen.
Lasse V. Karlsen

61

Sie können kombinieren $und @zusammen String - Interpolation und mehrzeiligen Stringliteral zu bekommen:

var str = $@"some text { obj1.property }
     more text { obj2.property }";

Aber das gibt dir einen NewLineCharakter dazwischen, also ist es vielleicht nicht das, was du willst.


3
Aber setzt @ den Zeilenvorschub nicht tatsächlich in das Literal ein?
Jeremiah Gowdy

5
Es tut. Meine Antwort wurde aktualisiert, um dies ausdrücklich zu sagen.
MarcinJuraszek

Nicht nur eine neue Zeile, sondern auch die ersten Registerkarten der neuen Zeile. Um das tatsächliche Zeichenfolgenformat bei Verwendung $@"in Visual Studio korrekt darzustellen , müssen Sie jede neue Zeile ganz links im Texteditor beginnen.
GDS

Mit dieser Lösung können Sie nicht zB \ r und \ n in der Zeichenfolge verwenden
Johan Franzén

22

Während OP nach etwas anderem fragte, erwarte ich, dass viele Leute, die diese Frage lesen, eine mehrzeilige Interpolation wünschen $"", die so funktioniert @"". Verwenden Sie dazu$@""

$@"Height: {height}
Width: {width}
Background: {background}"

3
Er möchte keine Zeilenumbrüche in der Ausgabe, nur den Code selbst, der in verschiedene Zeilen eingeschlossen wird
Martin Capodici,

7
Er machte deutlich, dass diese Antwort für das Publikum gedacht war, das auf der Suche nach mehrzeiligen Zeichenfolgen mithilfe der String-Interpolationssyntax ist.
Brandon Bonds

2

Das ist es:

var str = $"some text { obj1.property }" +
          $" more text { obj2.property }";

Beachten Sie die zweite $in der$"..." + $"..."


18
Beachten Sie, dass dies zwei Aufrufe von String.Format macht und auch drei Strings im Speicher erstellt (Seite A, Seite B und A + B)
Kevin Kalitowski

1
Würde dies Sie nicht daran hindern, einen FormattableStringCast für die verkettete Zeichenfolge zu verwenden?
Binki

4
In vielen heutigen Implementierungen führt die Ausführung auf einer GHz-CPU mit GB Speicher, einem zusätzlichen Aufruf und einer zusätzlichen Zeichenfolge nicht zu Leistungsproblemen. Leistungsprobleme werden beispielsweise durch die Verwendung eines Algorithmus von O (n2) verursacht. Ich finde es unfair, diesen Typen herabzustimmen.
Johan Franzén

1

Ich habe StringBuilder in überschriebenem ToString () als Beispiel verwendet.

    // return employee data
    public override string ToString()
    {
        StringBuilder buffer = new StringBuilder();
        buffer.AppendLine($"Number: {EmployeeNumber}");
        buffer.AppendLine($"Name: {EmployeeName}");
        buffer.AppendLine($"Address: {PostalAddress}");
        buffer.AppendLine($"Phone: {PhoneNumber}");
        buffer.AppendLine($"Age: {EmployeeAge}");
        buffer.AppendLine($"Gender: {EmployeeGender}");
        buffer.AppendLine($"Status: {EmployeeStatus}");
        buffer.AppendLine($"Manager: {EmployeeManager}");
        buffer.AppendLine($"Start: {EmployeeStartDate.ToShortDateString()}");
        return buffer.ToString();
    }

warum dann nicht buffer.AppendFormat("{0}Number: {1}", Environment.NewLine, EmployeeNumber);???
TS
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.