Ho una versione di prova di Resharper e mi suggerisce sempre di passare da stringhe regolari a stringhe testuali. Qual è la differenza?
Ho una versione di prova di Resharper e mi suggerisce sempre di passare da stringhe regolari a stringhe testuali. Qual è la differenza?
Risposte:
Una stringa testuale è una stringa che non ha bisogno di essere salvata, come un nome file:
string myFileName = "C:\\myfolder\\myfile.txt";
sarebbe
string myFileName = @"C:\myfolder\myfile.txt";
Il simbolo @ significa leggere quella stringa letteralmente e non interpretare altrimenti i caratteri di controllo.
Questo è trattato nella sezione 2.4.4.5 della specifica C # :
2.4.4.5 Letterali stringa
C # supporta due forme di letterali stringa: letterali stringa regolari e letterali stringa letterali.
Un letterale stringa normale è costituito da zero o più caratteri racchiusi tra virgolette doppie, 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.
Una stringa letterale letterale è composta da un carattere @ seguito da un carattere tra virgolette doppie, zero o più caratteri e un carattere di virgolette doppie chiuso. Un semplice esempio è @ "ciao". In una stringa letterale letterale, i caratteri tra i delimitatori sono interpretati alla lettera, l'unica eccezione è una sequenza di escape quote. In particolare, le sequenze di escape semplici e le sequenze di escape esadecimali e Unicode non vengono elaborate in letterali di stringa testuali. Una stringa letterale letterale può comprendere più righe.
In altre parole, l'unico carattere speciale in una "stringa letterale letterale" @ è il carattere a virgoletta doppia. Se si desidera scrivere una stringa testuale contenente una virgoletta doppia, è necessario scrivere due virgolette doppie. Tutti gli altri personaggi vengono interpretati letteralmente.
Puoi anche avere nuove righe letterali in una stringa letterale letterale. In una stringa normale letterale non puoi avere nuove righe letterali. Invece devi usare per esempio"\n"
.
I letterali di stringhe 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 dovrebbero essere evitate se si utilizzasse un letterale di stringa normale.
Non c'è differenza al momento dell'esecuzione tra stringhe create da valori letterali di stringa regolari e stringhe create da valori letterali di stringa testuali - sono entrambi di tipo System.String
.
Non esiste alcuna differenza di runtime tra una stringa e una stringa testuale. Sono diversi solo al momento della compilazione. Il compilatore accetta meno sequenze di escape in una stringa testuale, quindi ciò che vedi è ciò che ottieni diverso da una citazione.
Puoi anche usare il carattere testuale, @, per dire al compilatore di trattare 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 stringhe testuali:
Console.WriteLine(@"This
is
a
Test
for stackoverflow");
senza di @
te hai un errore.
In VB14 c'è una nuova funzionalità chiamata Multiline Strings
, è come stringhe testuali in C #.
Consiglio del professionista: i letterali di stringa VB ora sono esattamente come stringhe testuali C #.
Le stringhe regolari usano sequenze speciali di escape per tradurre in 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 vengono interpretate così come sono, senza tradurre sequenze 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\\.");