Ich habe eine Testversion von Resharper und es wird immer empfohlen, reguläre Zeichenfolgen auf wörtliche Zeichenfolgen umzustellen. Was ist der Unterschied?
Ich habe eine Testversion von Resharper und es wird immer empfohlen, reguläre Zeichenfolgen auf wörtliche Zeichenfolgen umzustellen. Was ist der Unterschied?
Antworten:
Eine wörtliche Zeichenfolge muss nicht maskiert werden, wie ein Dateiname:
string myFileName = "C:\\myfolder\\myfile.txt";
wäre
string myFileName = @"C:\myfolder\myfile.txt";
Das @ -Symbol bedeutet, diese Zeichenfolge wörtlich zu lesen und Steuerzeichen nicht anders zu interpretieren.
Dies wird in Abschnitt 2.4.4.5 der C # -Spezifikation behandelt :
2.4.4.5 String-Literale
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.
Mit anderen Worten, das einzige Sonderzeichen in einem @ "wörtlichen Zeichenfolgenliteral" ist das doppelte Anführungszeichen. Wenn Sie eine wörtliche Zeichenfolge mit einem doppelten Anführungszeichen schreiben möchten, müssen Sie zwei doppelte Anführungszeichen schreiben. Alle anderen Zeichen werden wörtlich interpretiert.
Sie können sogar wörtlich neue Zeilen in einem wörtlichen Zeichenfolgenliteral haben. In einem regulären String-Literal können keine neuen Zeilen wörtlich stehen. Stattdessen müssen Sie zum Beispiel verwenden "\n"
.
Wörtliche Zeichenfolgenliterale sind häufig nützlich, um Dateinamen und reguläre Ausdrücke in den Quellcode einzubetten, da Backslashes in diesen Zeichenfolgentypen häufig vorkommen und bei Verwendung eines regulären Zeichenfolgenliterals maskiert werden müssten.
Zur Laufzeit gibt es keinen Unterschied zwischen Zeichenfolgen, die aus regulären Zeichenfolgenliteralen erstellt wurden, und Zeichenfolgen, die aus wörtlichen Zeichenfolgenliteralen erstellt wurden. Beide sind vom Typ System.String
.
Es gibt keinen Laufzeitunterschied zwischen einer Zeichenfolge und einer wörtlichen Zeichenfolge. Sie unterscheiden sich nur zur Kompilierungszeit. Der Compiler akzeptiert weniger Escape-Sequenzen in einer wörtlichen Zeichenfolge, sodass das, was Sie sehen, das ist, was Sie erhalten, außer einem Escape-Anführungszeichen.
Sie können auch das wörtliche Zeichen @ verwenden, um den Compiler anzuweisen, ein Schlüsselwort als Namen zu behandeln:
var @if = "if";
//okay, treated as a name
Console.WriteLine(@if);
//compiler err, if without @ is a keyword
Console.WriteLine(if);
var @a = "a";
//okay
Console.WriteLine(@a);
//also okay, @ isn't part of the name
Console.WriteLine(a);
Sie können auch mehrzeilige Zeichenfolgen mit wörtlichen Zeichenfolgen verwenden:
Console.WriteLine(@"This
is
a
Test
for stackoverflow");
ohne dass @
du einen Fehler hast.
In VB14 gibt es eine neue Funktion namens Multiline Strings
wörtliche Zeichenfolgen in C #.
Pro-Tipp: VB-String-Literale sind jetzt genau wie wörtliche C # -Strings.
Normale Zeichenfolgen verwenden spezielle Escape-Sequenzen, um in Sonderzeichen zu übersetzen.
/*
This string contains a newline
and a tab and an escaped backslash\
*/
Console.WriteLine("This string contains a newline\nand a tab\tand an escaped backslash\\");
Wörtliche Zeichenfolgen werden so interpretiert, wie sie sind, ohne Escape-Sequenzen zu übersetzen:
/*
This string displays as is. No newlines\n, tabs\t or backslash-escapes\\.
*/
Console.WriteLine(@"This string displays as is. No newlines\n, tabs\t or backslash-escapes\\.");