1416 Stimmen

Mehrzeiliges String-Literal in C#

Gibt es eine einfache Möglichkeit, eine mehrzeilige String-Literal in C# zu erstellen?

Hier ist, was ich jetzt habe:

string query = "SELECT foo, bar"
+ " FROM table"
+ " WHERE id = 42";

Ich weiß, PHP hat

<<<BLOCK

BLOCK;

Gibt es in C# etwas Ähnliches?

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.

87voto

Carvo Loco Punkte 1969

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

3 Stimmen

Die Verwirrung, die einige (mich eingeschlossen) beim Betrachten der ursprünglichen Frage hatten, ist, dass das here-doc Format (shell, php, perl, ...) die Zeilenumbrüche enthält. Wenn der OP also mit PHP's heredoc vergleicht, dann sollte die Einbeziehung der Zeilenumbrüche kein Problem sein.

0 Stimmen

Ganz genau. Soweit ich weiß, ist Ihre Antwort "Nein, das kann man in C# nicht machen" richtig.

1 Stimmen

Mir wurde gesagt, dass in Java eine solche verkettete Zeichenfolge im kompilierten Bytecode zu einem einzelnen Zeichenfolgenliteral wird. Vielleicht ist das bei Dot Net auch der Fall?

67voto

Isanka Thalagala Punkte 1301

Mehrere Zeilen hinzufügen: @ verwenden

string query = @"SELECT foo, bar
FROM table
WHERE id = 42";

String-Werte in der Mitte hinzufügen: $ verwenden

string text ="beer";
string query = $"SELECT foo {text} bar ";

Mehrzeilige Zeichenfolge Werte in der Mitte hinzufügen: $@ verwenden

string text ="Customer";
string query = $@"SELECT foo, bar
FROM {text}Table
WHERE id = 42";

0 Stimmen

Dies sollte die akzeptierte Antwort sein

24voto

vovkas Punkte 1033

Sie können verwenden @ y "" .

        string sourse = @"{
        ""items"":[
        {
            ""itemId"":0,
            ""name"":""item0""
        },
        {
            ""itemId"":1,
            ""name"":""item1""
        }
        ]
    }";

4 Stimmen

Sie sollten erklären, was die einzelnen Funktionen sind, denn @ steht für wortwörtliche Zeichenketten und "" für das Ausbrechen von doppelten Anführungszeichen.

1 Stimmen

Gibt es eine schnelle Möglichkeit, dies zu tun, ohne alle doppelten Anführungszeichen zu suchen/ersetzen, zum Beispiel in eingefügtem JSON?

15voto

RobertHana Punkte 185

Ich habe das noch nicht gesehen, also werde ich es hier posten (wenn Sie an der Übergabe einer Zeichenkette interessiert sind, können Sie das auch tun). Die Idee ist, dass Sie die Zeichenkette auf mehrere Zeilen aufteilen und Ihren eigenen Inhalt (auch auf mehreren Zeilen) in beliebiger Weise hinzufügen können. Hier kann "tableName" an den String übergeben werden.

    private string createTableQuery = "";

    void createTable(string tableName)
    {

         createTableQuery = @"CREATE TABLE IF NOT EXISTS
                ["+ tableName  + @"] (
               [ID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
               [Key] NVARCHAR(2048)  NULL, 
               [Value] VARCHAR(2048)  NULL
                                )";
    }

11 Stimmen

Ziemlich gefährlich, würde ich sagen: leicht für jemanden, eine Sql-Injektion auf diese Weise zu machen.

7 Stimmen

Es ist in Ordnung, solange Sie wissen, dass alle Ihre Variablen (wenn überhaupt!) in Ihrem Abfrage-String aus Code-Konstanten oder einer anderen sicheren Quelle stammen - z.B., createTable("MyTable"); Auf jeden Fall ging es bei der Frage des Autors darum, wie man mehrzeilige String-Literale direkt in den Code eingibt, und nicht darum, wie man Datenbankabfragen an sich konstruiert :)

2 Stimmen

Sollte wahrscheinlich einen String Builder verwenden, insbesondere wenn die Anzahl der Pluszeichen (+) sehr hoch ist.

8voto

TamaMcGlinn Punkte 2257

Ja, Sie können eine Zeichenkette auf mehrere Zeilen aufteilen, ohne Zeilenumbrüche in die eigentliche Zeichenkette einzufügen, aber das ist nicht schön:

string s = $@"This string{
string.Empty} contains no newlines{
string.Empty} even though it is spread onto{
string.Empty} multiple lines.";

Der Trick besteht darin, Code einzuführen, der als leer ausgewertet wird, und dieser Code kann Zeilenumbrüche enthalten, ohne die Ausgabe zu beeinflussen. Ich habe diesen Ansatz von diese Antwort auf eine ähnliche Frage.

Offensichtlich gibt es einige Verwirrung darüber, was die Frage ist, aber es gibt zwei Hinweise darauf, dass wir hier ein String-Literal wollen, das keine Zeilenumbrüche enthält und dessen Definition sich über mehrere Zeilen erstreckt. (in den Kommentaren sagt er das, und "here's what I have" zeigt Code, der keine Zeichenkette mit Zeilenumbrüchen darin erzeugt)

Dieser Einheitstest zeigt die Absicht:

    [TestMethod]
    public void StringLiteralDoesNotContainSpaces()
    {
        string query = "hi"
                     + "there";
        Assert.AreEqual("hithere", query);
    }

Ändern Sie die obige Definition der Abfrage so, dass es sich um ein einziges Stringliteral handelt, statt um die Verkettung von zwei Stringliteralen, die vom Compiler zu einem einzigen optimiert werden können oder auch nicht.

Der C++-Ansatz wäre, jede Zeile mit einem umgekehrten Schrägstrich zu beenden, wodurch das Zeilenumbruchszeichen escaped wird und nicht in der Ausgabe erscheint. Leider gibt es dann immer noch das Problem, dass jede Zeile nach der ersten linksbündig ausgerichtet sein muss, um dem Ergebnis keinen zusätzlichen Leerraum hinzuzufügen.

Es gibt nur eine Möglichkeit, die nicht von Compiler-Optimierungen abhängt, die möglicherweise nicht stattfinden, nämlich die Definition in eine Zeile zu packen. Wenn Sie sich auf Compiler-Optimierungen verlassen wollen, ist das +, das Sie bereits haben, großartig; Sie müssen die Zeichenkette nicht linksbündig ausrichten, Sie erhalten keine Zeilenumbrüche im Ergebnis, und es ist nur eine Operation, keine Funktionsaufrufe, bei der Sie eine Optimierung erwarten können.

1 Stimmen

Kreativ. Es scheint jedoch (nicht bestätigt), dass dies als Formatstring behandelt wird und möglicherweise optimiert wird oder nicht. Auf der anderen Seite ist der "+"-Ansatz von OP der beste. Laut Spezifikation ist die Optimierung garantiert: stackoverflow.com/a/288802/9399618

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X