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


166

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


3
Non ho mai visto questo suggerimento da ReSharper. Puoi fare un esempio in cui suggerisce questo?
John Saunders,

3
Ho appena capito. Il primo suggerimento era di spostarlo in una risorsa, ma il secondo era di renderlo una stringa testuale: MessageBox.Show ("Un ornitorinco deve essere accarezzato prima che il lavoro possa procedere.");
B. Clay Shannon,

Lo capisco ancora tutto il tempo. In genere è uno degli avvertimenti di resharper che si desidera disattivare, poiché suggerisce di rendere le stringhe testuali senza motivo.
Dean Swiatek,

Se ti piace la mia funzionalità suggerita per l'IDE di Visual Studio, ti preghiamo di effettuare l'upgrade qui: developercommunity.visualstudio.com/idea/602807/…
Olivier Jacot-Descombes

Risposte:


191

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.


12
Mi chiedo perché Resharper suggerisca questo cambiamento. Qualche guru del CLR sa se le stringhe testuali vengono elaborate in modo più efficiente poiché i caratteri di escape possono essere ignorati?
Matt Peterson,

9
Penso che forse ReSharper lo suggerisca perché la stringa testuale è più leggibile.
andyp,

36
Credo che sia una specie di convenzione di programmazione (non ho mai visto o sentito prima). Per le stringhe ReSharper suggerisce di spostarlo in un file di risorse per la localizzazione o di renderlo testuale - per le stringhe testuali ReSharper non offre più la possibilità di localizzare la stringa. Quindi sembra una convenzione rendere stringhe tutte le stringhe che non necessitano di localizzazione.
Daniel Brückner,

Diciamo che abbiamo stringa letterale assegnata alla variabile stringa, stringa myFileName = "C: \\ myfolder \\ myfile.txt"; Ora, voglio convertire la variabile di stringa myFileName in stringa testuale. Come lo faccio? funziona? string verbatimStr = @myFileName;
sanjeev bhusal,

3
@sanjeevbhusal: non lo fai mai davvero. @ "C: \ myfolder \ myfile.txt" e "C: \\ myfolder \\ myfile.txt" sono la stessa cosa per il CLR. In pratica è solo zucchero sintattico.
alc6379,

68

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.


27

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

16

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 #.

Stringhe multilinea

Consiglio del professionista: i letterali di stringa VB ora sono esattamente come stringhe testuali C #.


13

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

0

Se si desidera rimuovere gli avvisi di Resharper, è possibile utilizzare:

Localizable(false)

Per cose come parametri, posizioni dei file, ad es. questa potrebbe essere una buona soluzione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.