2012-08-30 5 views
6

Ich fange an, C# zu lernen, und ich verstehe nicht, warum reguläre Zeichenfolgenliterale (d. H. " ") keine Literalzeilen enthalten dürfen. (Ich spreche nicht über die Escape-Sequenz \n). Ich weiß, dass Sie wortgetreue Zeichenfolgenliterale (d. H. @" ") für mehrzeilige Zeichenfolgen verwenden müssen, aber warum?Warum können Nicht-Verbatim-Zeichenfolgen keine Zeilenumbrüche enthalten?

regular string produces "Newline in constant" errorverbatim string produces no error

Ich habe es nicht explizit gesehen erklärt, dass man sie nicht in regelmäßigen Strings verwenden können. Mehr als das, außer wo es im Vorbeigehen erwähnt wird, dass ich verbatim Strings dafür verwenden kann, scheint alles, was ich gelesen habe, darauf hinzudeuten, dass literale Newline-Zeichen in regulären Stringliteralen erlaubt wären.

Beginning Visual C# 2010 und Code: Generating Multiline String Literals (Visual C#) zeigen Beispiele für mehrzeilige Strings ohne weitere Erläuterung.

Learning C# 3.0 sagt dies:

In der Sprache C#, Leerzeichen, Tabulatoren und Zeilenumbrüche in Betracht gezogen werden, wird Leerzeichen .... Zusätzliche Leerzeichen werden im Allgemeinen in C# Aussagen ignoriert. ... Die Ausnahme von dieser Regel ist, dass Leerzeichen innerhalb einer Zeichenfolge als Literal behandelt werden; Es wird nicht ignoriert.

Also ist es buchstäblich? Das würde ich auch erwarten, aber das ist es nicht.
Es enthält auch dieses Tipbox:

Tip
Visual Basic Programmierer zur Kenntnis nehmen: in C#, die End-of-line hat keine besondere Bedeutung. Anweisungen werden mit Semikolons und nicht mit Zeilenvorschubzeichen beendet. Es gibt kein Zeilenfortsetzungszeichen, da keines benötigt wird.

(Ich weiß, dass dies über außerhalb von Strings spricht, aber warum sollte end-of-line haben eine besondere Bedeutung Parsing innerhalb eine Zeichenfolge, wenn sie nicht außerhalb einer Schnur tut?)

Having endlich meinen Weg zum string (C# Reference) selbst gefunden, habe ich noch keinen Einblick bekommen:

Stringliterale können beliebige Zeichenliterale enthalten. Escape-Sequenzen sind enthalten. Im folgenden Beispiel wird die Escape-Sequenz \\ für Backslash, \u0066 für den Buchstaben f und \n für Newline verwendet.

Er sagt, dass Escape-Sequenzen verwendet werden kann, aber es sagt nicht, sie verwendet werden müssen. Sind buchstabengetreue Newline-Zeichen nicht in "beliebiges Zeichenliteral" enthalten? Wenn ich eine Zeichenfolge habe, die anstelle der Escape-Sequenz \t ein Literalzeichen enthält, gibt es keinen Fehler. Aber wenn ich einen Literal Newline habe, bekomme ich einen Fehler. Ich habe sogar die Zeilenenden der Datei von \r\n zu \n oder \r ohne Wirkung geändert.


Natürlich, ich bin in der Lage aus den Beispielen zu schließen und von Visual Studio Fehlern, die wörtliche Zeichenfolge ist erforderlich, wenn es ein wörtliches Newline-Zeichen enthält, aber alles, was ich gelesen habe, läßt vermuten, dass nicht der Fall sein sollte, . Warum der Unterschied?

+0

Ich denke, es ist wahrscheinlich einer dieser "weil so die Sprache funktioniert" Dinge .. Es wurde wahrscheinlich von anderen Sprachen inspiriert, dass neue C# -Programmierer kommen würde. Wie Sie bereits erwähnt haben, können Sie das Präfix @ verwenden, um eine wörtliche String-Konstante zu definieren. –

+0

@MikeChristensen Oh ja, und ich habe versucht, die literale Newline mit einem Backslash zu entkommen, wie ich in C/C++ gesehen habe. Auch kein Glück. – Wiseguy

Antwort

5

Nun, schießen. Richtig, als ich das einreichte, fand ich die Antwort.

Sind buchstabengetreue Newline-Zeichen nicht in "beliebiges Zeichenliteral" enthalten?

Offenbar, nein, sind sie nicht.

2.4.4.4 Character literals:

zeichen literal:

'Charakter'

Charakter:

Einzelzeichen

Einzelzeichen:

alle Zeichen außer '(U + 0027), \ (U + 005C) und new-line-character

+0

Ja. Aber warum sind in Zeichenliteralen keine neuen Zeilen enthalten? –

+0

@ZaidMasud Sprachdesign Entscheidungen sind weit über den Umfang meiner Frage. Mein Einwand war einfach, dass dieses Merkmal nicht klar definiert war, was es tatsächlich ist. – Wiseguy

+0

Ja, die Spezifikation ist konsistent. Mehr von einem neugierigen Grübeln meinerseits. –

1

Wahrscheinliche dupe of Why must C/C++ string literal declarations be single-line?

Kurz gesagt, weil die C-Sprache es nicht unterstützt.

Ein Tippfehler, bei dem ein String-Literal nicht geschlossen wird, schlürfte den Rest der Datei als einzelnes Token und überließ dem Programmierer eine Compiler-Fehlermeldung in der Art "erwartet ein Semikolon bei Zeile xxx, Spalte yyy" Der angegebene Speicherort ist das Ende der Quelldatei.

Meistens verwenden Sie keine mehrzeiligen Literale. Besser, sie aus einer UX-Perspektive explizit zu machen.

Weiter wurde in der eingeschränkten Umgebung die C-Sprache in (8K PDP-11?) Entwickelt, ich vermute, dass eine Art von Überlauf den Compiler abstürzen könnte.

Die Sprache C tut wörtlichen Splicing unterstützen, obwohl, was hilfreich ist:

char *txt = "this is line 1\n" 
      "this is line 2\n" 
      "this is line 3\n" 
      ; 

Es unterstützt auch Linie Spleißen:

char *txt = "this is my\n\ 
multi-line string literal\n\ 
isn't it nice?\n" ; 

Funktionen, die ich wünsche, C# hatten.

+0

Ja, ich habe auch versucht, ohne Erfolg zu spleißen. War ein wenig überrascht, da, wenn die Beschränkung von Vorfahren der C-Familie geerbt wird, ich dachte, dass es das auch erben würde. – Wiseguy

+0

Ja, Splicing fühlt sich an wie es sein sollte. Die Tatsache, dass man mit "+" verketten kann, wurde vielleicht als die Notwendigkeit gesehen, die Notwendigkeit zu beseitigen. –

1

C# (zusammen mit C++, C, Java, die ihre Syntax beeinflusst) haben eine sehr einfache Regel für Leerzeichen:

Sie können tun, was man will.

Dies ermöglicht Formatierung der Dinge, wie Sie wollen, für die Lesbarkeit. Nun könnte ein Python-Fan sagen, dass der Vorteil überbewertet ist, aber es ist ein Vorteil, den wir nutzen.

Zeilenumbrüche könnten das durcheinander bringen. Alle moreso wenn Sie nicht sicher sind, ob die Newline in der Quelle bedeuten sollte, dass wir einsetzen "\u000D", "\u000A", "\u000A\u000D", "\u0085", "\u000B", "\u000C", "\u2028" oder "\u2029" in die Zeichenfolge, die alle über Newline Semantik und die ersten vier welche unterschiedliche System "nur gesunde Art und Weise Newline zu tun haben, ist jeder andere falsch".

Sie könnten immer noch argumentieren, dass der Nachteil, es zuzulassen, überbewertet wird. C# tut - schließlich ist die Form der Zeichenfolgen, die nicht sind, wie Leute von C++ usw. erwarten können. lässt es erlauben.

+0

Ich dachte "Was ist das wichtig?" solange die Zeichenfolge schließlich mit einem schließenden Zitat beendet wird (wie es zum Beispiel bei PHP der Fall ist), aber ein guter Punkt bezüglich der Mehrdeutigkeit der Zeilenendung. – Wiseguy

Verwandte Themen