Warum verwechseln die Leute immer wieder Strings mit String-Literalen? Die akzeptierte Antwort ist eine gute Antwort auf eine andere Frage, aber nicht auf diese.
Ich weiß, dass dies ein altes Thema ist, aber ich bin hierher gekommen, weil ich wahrscheinlich die gleiche Frage wie der OP hatte, und es ist frustrierend zu sehen, wie die Leute es immer wieder falsch verstehen. Oder vielleicht interpretiere ich sie falsch, ich weiß es nicht.
Grob gesagt ist eine Zeichenkette ein Bereich des Computerspeichers, der während der Ausführung eines Programms eine Folge von Bytes enthält, die auf Textzeichen abgebildet werden können. Ein Stringliteral hingegen ist ein noch nicht kompilierter Teil des Quellcodes, der den Wert darstellt, der später bei der Ausführung des Programms, in dem er vorkommt, zur Initialisierung eines Strings verwendet wird.
In C# ist die Anweisung...
string query = "SELECT foo, bar"
+ " FROM table"
+ " WHERE id = 42";
... nicht eine dreizeilige Zeichenkette erzeugen, sondern eine einzeilige; die Verkettung von drei Zeichenketten (die jeweils aus einem anderen Literal initialisiert werden), von denen keine einen Zeilenumbruchmodifikator enthält.
Was die OP zu fragen scheint - zumindest was ich mit diesen Worten fragen würde - ist nicht, wie man in der kompilierten Zeichenkette Zeilenumbrüche einführt, die die im Quellcode gefundenen nachahmen, sondern wie man eine lange, einzelne Textzeile im Quellcode zur besseren Übersichtlichkeit umbricht ohne die Brüche in der kompilierten Zeichenkette einführen. Und das ohne eine längere Ausführungszeit zu benötigen, die für das Zusammenfügen der mehreren Teilstrings aus dem Quellcode aufgewendet wird. Wie die abschließenden Backslashes innerhalb eines mehrzeiligen String-Literal in Javascript oder C++.
Vorschlag zur Verwendung von wortwörtlichen Zeichenfolgen, vergessen Sie's StringBuilder
s, String.Join
s oder sogar verschachtelte Funktionen mit String-Umkehrungen und was nicht, lässt mich glauben, dass die Leute die Frage nicht wirklich verstehen. Oder vielleicht verstehe ich sie nicht.
Soweit ich weiß, hat C# (zumindest in der altsteinzeitlichen Version, die ich noch benutze, aus dem letzten Jahrzehnt) keine Funktion, um mehrzeilige Strings sauber zu erzeugen Literale die während der Kompilierung und nicht während der Ausführung aufgelöst werden können.
Vielleicht unterstützen aktuelle Versionen es, aber ich dachte, ich würde den Unterschied, den ich zwischen Strings und String-Literalen wahrnehme, teilen.
UPDATE:
(Aus dem Kommentar von MeowCat2012) Sie können. Der "+"-Ansatz von OP ist der beste. Je nach Spezifikation ist die Optimierung garantiert: http://stackoverflow.com/a/288802/9399618
2 Stimmen
In Ihrem Beispiel gibt es keine Zeilenumbrüche. Möchten Sie sie?
12 Stimmen
Nein. Ich wollte nur mehrere Zeilen aus Gründen der Sichtbarkeit/Code-Sauberkeit.
10 Stimmen
In diesem Fall enthalten die wörtlichen Zeichenfolgen die Zeilenumbrüche. Sie können @"...".Replace(Environment.NewLine,"") verwenden, wenn Sie möchten.
14 Stimmen
Sie sollten sich überlegen, ob Sie die
42
als Parameter zu verwenden, vor allem, wenn er aus Benutzereingaben stammt, um SQL-Injection zu vermeiden.3 Stimmen
@weiqure: Environment.NewLine spiegelt nicht unbedingt die Zeilenumbrüche in der Zeichenkette wider, da die Zeilenumbrüche so genommen werden, wie sie im Quellcode vorkommen. Man kann also den Code auch mit unterschiedlichen Zeilenumbrüchen in jeder Zeile schreiben, die sich alle von dem unterscheiden, was Environment.NewLine auf dem Zielsystem sagt!