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.

2102voto

John Rasch Punkte 60054

Sie können die @ Symbol vor einem string zu einer wortwörtliches String-Wort :

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

Auch Sie müssen Sonderzeichen nicht entschlüsseln wenn Sie diese Methode verwenden, außer bei doppelten Anführungszeichen, wie in der Antwort von Jon Skeet gezeigt.

47 Stimmen

Es ist sowieso ein String-Literal - es ist ein wortwörtlich String-Literal mit dem @-Zeichen.

129 Stimmen

Wenn Ihre Zeichenkette doppelte Anführungszeichen (") enthält, können Sie diese wie folgt umgehen: "" (das sind zwei doppelte Anführungszeichen)

13 Stimmen

Gibt es eine Möglichkeit, das oben genannte zu tun, ohne neue Zeilen zu erstellen? Ich habe ein wirklich langes Stück Text, das ich gerne in der IDE umbrochen sehen würde, ohne das Plus zu verwenden ("Hallo" + "dort").

703voto

Jon Skeet Punkte 1325502

Man nennt es einen wortwörtliches String-Wort in C#, und es ist nur eine Frage von @ vor dem Literal. Dies ermöglicht nicht nur mehrere Zeilen, sondern schaltet auch das Escaping aus. So können Sie zum Beispiel tun:

string query = @"SELECT foo, bar
FROM table
WHERE name = 'a\b'";

Dabei werden jedoch die Zeilenumbrüche (je nachdem, wie sie in Ihrer Quelle aussehen) in die Zeichenkette einbezogen. Für SQL ist das nicht nur harmlos, sondern wahrscheinlich verbessert die Lesbarkeit überall dort, wo Sie die Zeichenfolge sehen - aber an anderen Stellen kann es nicht erforderlich sein, in diesem Fall müssen Sie entweder nicht verwenden eine mehrzeilige wörtliche Zeichenfolge literal zu beginnen, oder entfernen Sie sie aus der resultierenden Zeichenfolge.

Das einzige kleine Problem ist, dass Sie ein zusätzliches Anführungszeichen hinzufügen müssen, wenn Sie ein doppeltes Anführungszeichen wünschen:

string quote = @"Jon said, ""This will work,"" - and it did!";

8 Stimmen

Diese Antwort ist falsch; sie führt Zeilenumbrüche ein, die der OP nicht wünscht.

6 Stimmen

@TamaMcGlinn: Ich werde in der Antwort etwas dazu schreiben - es war nicht klar, als der Auftraggeber die Frage schrieb.

245voto

Riegardt Steyn Punkte 4770

Nebenbei bemerkt, mit C# 6.0 können Sie nun interpolierte Strings mit dem verbatim-Stringliteral kombinieren:

string camlCondition = $@"
<Where>
    <Contains>
        <FieldRef Name='Resource'/>
        <Value Type='Text'>{(string)parameter}</Value>
    </Contains>
</Where>";

15 Stimmen

Cool, das wusste ich bis jetzt noch gar nicht. Wenn jemand interessiert ist: Das $-Ding heißt "Interpolated Strings" und man kann es hier im Detail nachlesen: msdn.microsoft.com/de-us/library/dn961160.aspx

0 Stimmen

Tx, habe die Formulierung korrigiert

5 Stimmen

Ich gehe davon aus, dass eine wörtliche geschweifte Klammer dann verdoppelt werden muss, z. B. $@"{{example literal text { fooString }. }}" Dies mag einige verwirren, da Angular, React und Vue.js die entgegengesetzte Konvention verwenden.

144voto

dav_i Punkte 26308

Das Problem bei der Verwendung von Stringliteralen ist, dass der Code dadurch ein wenig " seltsam ", denn um keine Leerzeichen in der Zeichenkette selbst zu erhalten, muss sie komplett linksbündig sein:

    var someString = @"The
quick
brown
fox...";

Igitt.

Die Lösung, die ich gerne verwende und die dafür sorgt, dass alles mit dem Rest des Codes übereinstimmt, lautet also:

var someString = String.Join(
    Environment.NewLine,
    "The",
    "quick",
    "brown",
    "fox...");

Wenn Sie die Zeilen einer SQL-Anweisung einfach nur logisch aufteilen wollen und eigentlich keine neue Zeile benötigen, können Sie natürlich auch einfach durch Environment.NewLine für " " .

3 Stimmen

Viel sauberer, danke. Außerdem funktioniert String.Concat ähnlich und benötigt kein Trennzeichen.

12 Stimmen

Die erste Version ist zwar hässlich, aber erfordert keinen Code zur Ausführung . Die zweite Option hat natürlich einen Laufzeit-Overhead für die Verkettung der einzelnen Strings.

0 Stimmen

Vielen Dank dafür, aber im Falle von wortwörtlichen Attributen lässt sich das nicht ändern. Zum Beispiel : [Tooltip(@"Very long string.....")], bei dem man keinen Code ausführen kann. Ich hatte vor, verbatim zu verwenden, weil der Code als einzeiliges String-Argument hässlich aussieht, wenn ich mit einem Vollbild-Editor arbeite. Aber dann verbatim fügt andere unsichtbare Zeichen, um die Zeichenfolge selbst, so dass ich keine andere Möglichkeit finden konnte.

107voto

Martin Clarke Punkte 5520

Ein weiteres Problem, auf das Sie achten sollten, ist die Verwendung von String-Literalen in string.Format. In diesem Fall müssen Sie geschweifte Klammern '{' und '}' vermeiden.

// this would give a format exception
string.Format(@"<script> function test(x) 
      { return x * {0} } </script>", aMagicValue)
// this contrived example would work
string.Format(@"<script> function test(x) 
      {{ return x * {0} }} </script>", aMagicValue)

14 Stimmen

Und welchen Unterschied macht das? Mit oder ohne "@" müssen Sie "{{" verdoppeln, um "{" als druckbares Zeichen zu erhalten, das ist eine Frage von String.Format, nicht von String-Inhalt.

12 Stimmen

Es ist ein bemerkenswertes Problem für Leute, die Javascript-Code in eine Zeichenkette einfügen wollen, was häufiger in wortwörtlichen Zeichenkettenliteralen als in regulären Zeichenketten vorkommt.

2 Stimmen

Im neuen C# 6.0 können Sie einen indizierten Eigenschaftsoperator zusammen mit dem wortwörtlichen Stringliteral verwenden (z. B. $@"Wert ist {this.Value}";)

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