Dies ist eine .NET-Frage für C # (oder möglicherweise VB.net), aber ich versuche herauszufinden, was der Unterschied zwischen den folgenden Deklarationen ist:
string hello = "hello";
vs.
string hello_alias = @"hello";
Das Ausdrucken auf der Konsole macht keinen Unterschied, die Längeneigenschaften sind gleich.
@
.Antworten:
Es markiert die Zeichenfolge als wörtliches Zeichenfolgenliteral - alles in der Zeichenfolge, das normalerweise als Escape-Sequenz interpretiert wird, wird ignoriert.
So
"C:\\Users\\Rich"
ist das gleiche wie@"C:\Users\Rich"
Es gibt eine Ausnahme: Für das doppelte Anführungszeichen wird eine Escape-Sequenz benötigt. Um einem doppelten Anführungszeichen zu entgehen, müssen Sie zwei doppelte Anführungszeichen hintereinander setzen. Zum Beispiel
@""""
wertet auf aus"
.quelle
{{
wenn Sie eine normale Klammer in einemstring.Format
Anruf verwenden möchten .Es ist ein wörtliches String-Literal . Dies bedeutet, dass die Flucht nicht angewendet wird. Zum Beispiel:
Hier
verbatim
undregular
haben den gleichen Inhalt.Es ermöglicht auch mehrzeilige Inhalte - was für SQL sehr praktisch sein kann:
Das einzige bisschen, das für wörtliche Zeichenfolgenliterale erforderlich ist, besteht darin, ein doppeltes Anführungszeichen (") zu erhalten, das Sie durch Verdoppeln ausführen:
quelle
Ein '@' hat auch eine andere Bedeutung: Wenn Sie es vor eine Variablendeklaration stellen, können Sie reservierte Schlüsselwörter als Variablennamen verwenden.
Zum Beispiel:
Ich habe nur ein oder zwei legitime Verwendungszwecke dafür gefunden. Hauptsächlich in ASP.NET MVC, wenn Sie so etwas tun möchten:
Welches würde einen HTML-Link erzeugen wie:
Andernfalls müssten Sie 'Klasse' verwenden, was kein reserviertes Schlüsselwort ist, aber der Großbuchstabe 'C' entspricht nicht den HTML-Standards und sieht einfach nicht richtig aus.
quelle
Da Sie auch explizit nach VB gefragt haben, möchte ich nur hinzufügen, dass diese wörtliche Zeichenfolgensyntax in VB nicht existiert, sondern nur in C #. Vielmehr sind alle Zeichenfolgen in VB wörtlich (mit Ausnahme der Tatsache, dass sie im Gegensatz zu wörtlichen C # -Strings keine Zeilenumbrüche enthalten können):
Escape-Sequenzen existieren in VB nicht (mit Ausnahme der Verdoppelung des Anführungszeichens, wie in wörtlichen C # -Strings), was einige Dinge komplizierter macht. Um beispielsweise den folgenden Code in VB zu schreiben, müssen Sie die Verkettung (oder eine der anderen Möglichkeiten zum Erstellen einer Zeichenfolge) verwenden.
In VB würde dies wie folgt geschrieben werden:
(
&
Ist der VB-String-Verkettungsoperator.+
Kann auch verwendet werden.)quelle
"
und zu werfen"
.String.Format
, was dies ermöglicht. Tatsächlich würde ich jetzt nie schreiben"x" & Environment.NewLine
und stattdessen immerString.Format("x{0}", Environment.Newline)
usw. verwenden . Dennoch ist C # hier bequemer."x" & nl & nl
oder"x" + nl + nl
oder"x" . $nl . $nl
jeden Tag vorbei"x\n\n"
. Auch"x" + bs + bs
vorbei"x\\\\"
. Und"x" + q + q
über"x\"\""
/"x"""""
. NunString.Format
, das ist ein weiteres Problem, das nichts mit dem Vergleich zu tun hat, den wir oben machen.http://msdn.microsoft.com/en-us/library/aa691090.aspx
C # unterstützt zwei Formen von String-Literalen: reguläre String-Literale und wörtliche String-Literale.
Ein reguläres Zeichenfolgenliteral besteht aus null oder mehr Zeichen in doppelten Anführungszeichen, wie in "Hallo", und kann sowohl einfache Escape-Sequenzen (z. B. \ t für das Tabulatorzeichen) als auch hexadezimale und Unicode-Escape-Sequenzen enthalten.
Ein wörtliches Zeichenfolgenliteral besteht aus einem @ -Zeichen, gefolgt von einem doppelten Anführungszeichen, null oder mehr Zeichen und einem abschließenden doppelten Anführungszeichen. Ein einfaches Beispiel ist @ "Hallo". In einem wörtlichen Zeichenfolgenliteral werden die Zeichen zwischen den Trennzeichen wörtlich interpretiert, wobei die einzige Ausnahme eine Anführungszeichen-Escape-Sequenz ist. Insbesondere werden einfache Escape-Sequenzen sowie hexadezimale und Unicode-Escape-Sequenzen nicht in wörtlichen String-Literalen verarbeitet. Ein wörtliches Zeichenfolgenliteral kann mehrere Zeilen umfassen.
quelle
Dies ist eine wörtliche Zeichenfolge, die die Escape-Regeln ändert. Das einzige Zeichen, das jetzt maskiert wird, ist ", maskiert nach". Dies ist besonders nützlich für Dateipfade und Regex:
usw
quelle
Von MSDN kopiert :
quelle
Wenn Sie ein
@
Zeichen vor eine Zeichenfolge setzen, können Sie Sonderzeichen wie Backslash oder doppelte Anführungszeichen verwenden, ohne Sondercodes oder Escapezeichen verwenden zu müssen.So können Sie schreiben:
anstatt:
quelle
Die Erklärung ist einfach. Um die Zeichenfolge darstellen
"string\"
, muss der Compiler ,"string\\"
da\
ist ein Escape - Zeichen. Wenn Sie@"string\"
stattdessen verwenden, können Sie vergessen\\
.quelle