Was ist der Unterschied zwischen einer regulären und einer wörtlichen Zeichenfolge?

166

Ich habe eine Testversion von Resharper und es wird immer empfohlen, reguläre Zeichenfolgen auf wörtliche Zeichenfolgen umzustellen. Was ist der Unterschied?

Xaisoft
quelle
3
Ich habe diesen Vorschlag von ReSharper noch nie gesehen. Können Sie ein Beispiel geben, wo dies nahelegt?
John Saunders
3
Ich habe es gerade bekommen. Der erste Vorschlag bestand darin, es in eine Ressource zu verschieben, der zweite darin, es zu einer wörtlichen Zeichenfolge zu machen: MessageBox.Show ("Ein Schnabeltier muss gestreichelt werden, bevor die Arbeit fortgesetzt werden kann.");
B. Clay Shannon
Ich bekomme es immer noch die ganze Zeit. Dies ist im Allgemeinen eine der Warnungen zum erneuten Schärfen, die Sie deaktivieren möchten, da vorgeschlagen wird, Zeichenfolgen ohne Grund wörtlich zu erstellen.
Dean Swiatek
Wenn Ihnen meine vorgeschlagene Funktion für die Visual Studio-IDE gefällt, stimmen Sie bitte hier ab: Developercommunity.visualstudio.com/idea/602807/…
Olivier Jacot-Descombes

Antworten:

191

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.

alc6379
quelle
12
Ich frage mich, warum Resharper diese Änderung vorschlägt. Wissen CLR-Gurus, ob wörtliche Zeichenfolgen effizienter verarbeitet werden, da Escape-Zeichen ignoriert werden können?
Matt Peterson
9
Ich denke, vielleicht schlägt ReSharper dies vor, weil die wörtliche Zeichenfolge besser lesbar ist.
Andyp
36
Ich glaube, es ist eine Art Codierungskonvention (ich habe sie noch nie gesehen oder gehört). Für Zeichenfolgen schlägt ReSharper vor, sie entweder zur Lokalisierung in eine Ressourcendatei zu verschieben oder wörtlich zu machen. Für wörtliche Zeichenfolgen bietet ReSharper dann nicht mehr die Option, die Zeichenfolge zu lokalisieren. Es scheint also eine Konvention zu sein, alle Zeichenfolgen, die keine Lokalisierung benötigen, wörtlich zu machen.
Daniel Brückner
Angenommen, wir haben der Zeichenfolgenvariablen Zeichenfolgenliteral zugewiesen. Zeichenfolge myFileName = "C: \\ myfolder \\ myfile.txt"; Jetzt möchte ich die Zeichenfolgenvariable myFileName in eine wörtliche Zeichenfolge konvertieren. Wie mache ich es? Funktioniert das? Zeichenfolge verbatimStr = @myFileName;
Sanjeev Bhusal
3
@sanjeevbhusal: Das machst du eigentlich nie. @ "C: \ myfolder \ myfile.txt" und "C: \\ myfolder \\ myfile.txt" sind dasselbe für die CLR. Im Grunde ist es nur syntaktischer Zucker.
Alc6379
68

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.

Mark Byers
quelle
27

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);
Corbin März
quelle
16

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 Stringswörtliche Zeichenfolgen in C #.

Mehrzeilige Saiten

Pro-Tipp: VB-String-Literale sind jetzt genau wie wörtliche C # -Strings.

Mohamad Shiralizadeh
quelle
13

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\\.");
BoltClock
quelle
0

Wenn Sie die Resharper-Warnungen entfernen möchten, können Sie Folgendes verwenden:

Localizable(false)

Für Dinge wie Parameter, Speicherorte, z. Dies könnte eine gute Lösung sein.

AndyO
quelle