Qual è la differenza tra una stringa normale e una stringa letterale?

Ho una versione di prova di Resharper e suggerisce sempre di passare stringhe regolari a stringhe letterali. Qual è la differenza?

Una stringa letterale è una stringa che non ha bisogno di essere sfuggita, come un nome di file:

string myFileName = "C:\\myfolder\\myfile.txt";

sarebbe

string myFileName = @"C:\myfolder\myfile.txt";

Il simbolo @ significa leggere letteralmente quella stringa e non interpretare altrimenti i caratteri di controllo.

Questo è trattato nella sezione 2.4.4.5 della specifica C # :

2.4.4.5 Stringhe letterali

C # supporta due forms di letterali stringa: letterali stringa regolari e valori letterali stringa letterali.

Un letterale stringa regolare consiste di zero o più caratteri racchiusi tra virgolette, come in “ciao” e può includere sia sequenze di escape semplici (come \ t per il carattere di tabulazione) sia sequenze di escape esadecimali e Unicode.

Un letterale stringa letterale è costituito da un carattere @ seguito da un carattere a virgolette, zero o più caratteri e un carattere di virgoletta doppia di chiusura. Un semplice esempio è @ “ciao”. In una letterale stringa letterale, i caratteri tra i delimitatori sono interpretati letteralmente, l’unica eccezione è una sequenza-escape-sequence. In particolare, le sequenze di escape semplici e le sequenze di escape esadecimali e Unicode non vengono elaborate in letterali stringa letterali. Una stringa letterale letterale può estendersi su più righe.

In altre parole, l’unico carattere speciale in un @ “letterale stringa letterale” è il carattere a virgolette. Se desideri scrivere una stringa letterale contenente una virgola doppia devi scrivere due virgolette. Tutti gli altri personaggi sono interpretati letteralmente.

Puoi anche avere letterali nuove righe in una stringa letterale letterale. In una normale stringa letterale non puoi avere letterali nuove righe. Invece devi usare ad esempio "\n" .

I valori letterali delle stringhe di Verbatim sono spesso utili per incorporare nomi di file ed espressioni regolari nel codice sorgente, poiché le barre rovesciate in questi tipi di stringhe sono comuni e devono essere sottoposte a escape se si utilizza un normale stringa normale.

Non vi è alcuna differenza in fase di esecuzione tra stringhe create da normali string letterali e stringhe create da letterali stringa letterali – sono entrambi di tipo System.String .

Non esiste alcuna differenza di runtime tra una stringa e una stringa letterale. Sono diversi solo al momento della compilazione. Il compilatore accetta un minor numero di sequenze di escape in una stringa letterale, quindi what-you-see-is-what-you-get non è un escape preventivo.

Puoi anche usare il carattere verbatim, @, per dire al compilatore di considerare una parola chiave come un nome:

 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); 

Puoi anche avere una stringa multilinea usando le stringhe letterali:

 Console.WriteLine(@"This is a Test for stackoverflow"); 

senza @ hai un errore

In VB14 c’è una nuova funzionalità chiamata Multiline Strings , è come le stringhe letterali in C #.

Stringhe multilinea

Suggerimento: i valori letterali delle stringhe VB ora sono esattamente come le stringhe letterali C #.

Stringhe regolari usano sequenze di escape speciali per tradurre caratteri speciali.

 /* 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\\"); 

Le stringhe Verbatim sono interpretate come sono, senza tradurre alcuna sequenza di escape:

 /* 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\\.");