Che cos'è @ davanti a una stringa in C #?


604

Questa è una domanda .NET per C # (o forse VB.net), ma sto cercando di capire qual è la differenza tra le seguenti dichiarazioni:

string hello = "hello";

vs.

string hello_alias = @"hello";

La stampa sulla console non fa alcuna differenza, le proprietà di lunghezza sono le stesse.


Si prega di vedere (e migliorare) il mio suggerimento per l'IDE di Visual Studio per una migliore formattazione delle stringhe testuali: Rientro stringhe testuali multilinea .
Olivier Jacot-Descombes,

Per essere chiari, gli esempi sopra stanno producendo esattamente lo stesso risultato con o senza @.
Miro J.,

Risposte:


768

Segna la stringa come una stringa letterale letterale - qualsiasi cosa nella stringa che normalmente verrebbe interpretata come una sequenza di escape viene ignorata.

Quindi "C:\\Users\\Rich"è lo stesso di@"C:\Users\Rich"

C'è un'eccezione: per la doppia citazione è necessaria una sequenza di escape. Per evitare una doppia virgoletta, devi mettere due virgolette doppie in una riga. Ad esempio, @""""valuta ".


1
@RichardEverett Ho capito la risposta, ma il mio dubbio è qual è l'effettivo utilizzo di questa funzione?
Arun,

24
@Arun È molto utile quando si tratta di stringhe contenenti cose come le definizioni di espressioni regolari che spesso hanno bisogno di cose per sfuggire a se stesse
James Thorpe,

25
+ contenuti
multilinea

4
dovrai anche raddoppiare le parentesi graffe {{se desideri utilizzare una parentesi graffa normale in una string.Formatchiamata.
Dave Cousineau,

4
@RichardEverett è molto utile per creare letterali con stringhe a più righe senza dover dividere la linea in pezzi.
John Mott,

256

È una stringa letterale letterale . Significa che la fuga non viene applicata. Per esempio:

string verbatim = @"foo\bar";
string regular = "foo\\bar";

Qui verbatime regularhanno gli stessi contenuti.

Permette anche contenuti multilinea - che possono essere molto utili per SQL:

string select = @"
SELECT Foo
FROM Bar
WHERE Name='Baz'";

L'unico bit di escape necessario per i letterali di stringhe testuali è quello di ottenere una doppia virgoletta (") che si ottiene raddoppiandola:

string verbatim = @"He said, ""Would you like some coffee?"" and left.";
string regular = "He said, \"Would you like some coffee?\" and left.";

16
Permette anche di usare parole riservate come nomi di variabili e cose. Come pubblico int GetValueOrDefault (int @default);
Svish,

5
Svish: vero ma non correlato a questa domanda specifica.
Jon Skeet,

63

Un '@' ha anche un altro significato: metterlo davanti a una dichiarazione di variabile consente di usare parole chiave riservate come nomi di variabili.

Per esempio:

string @class = "something";
int @object = 1;

Ho trovato solo uno o due usi legittimi per questo. Principalmente in ASP.NET MVC quando vuoi fare qualcosa del genere:

<%= Html.ActionLink("Text", "Action", "Controller", null, new { @class = "some_css_class" })%>

Che produrrebbe un collegamento HTML come:

<a href="/Controller/Action" class="some_css_class">Text</a>

Altrimenti dovresti usare 'Class', che non è una parola chiave riservata ma la 'C' maiuscola non segue gli standard HTML e non sembra giusta.


18

Dal momento che hai chiesto esplicitamente anche VB, lasciami solo aggiungere che questa sintassi della stringa testuale non esiste in VB, solo in C #. Piuttosto, tutte le stringhe sono testuali in VB (tranne per il fatto che non possono contenere interruzioni di riga, diversamente dalle stringhe testuali C #):

Dim path = "C:\My\Path"
Dim message = "She said, ""Hello, beautiful world."""

Le sequenze di escape non esistono in VB (ad eccezione del raddoppio del carattere di citazione, come nelle stringhe testuali C #) che rende alcune cose più complicate. Ad esempio, per scrivere il seguente codice in VB è necessario utilizzare la concatenazione (o uno qualsiasi degli altri modi per costruire una stringa)

string x = "Foo\nbar";

In VB questo sarebbe scritto come segue:

Dim x = "Foo" & Environment.NewLine & "bar"

( &è l'operatore di concatenazione di stringhe VB. +potrebbe essere utilizzato allo stesso modo.)


1
Oh mio Dio, sembra fastidioso ... ancora più contento che sto usando C # ora: p
Svish,

Non è possibile incorporare le interruzioni di riga nei letterali di stringa VB, anche se è possibile utilizzare letterali di stringa testuali di C #. Non sono quindi gli stessi.
Joey,

@Svish, aspetta che mi manchi qualcosa? Questo non è affatto un truffatore per VB. In effetti questo è un posto dove VB vince C #. È meglio farlo in questo modo e concedere esplicitamente le nuove linee e i caratteri speciali invece di lanciare tutti i caratteri speciali tra il "e ".
Pacerier,

@Pacerier Questa è una sciocchezza. Non appena esegui più di una banale elaborazione di stringhe, sono indispensabili adeguate strutture per la creazione di stringhe e la capacità di gestire in modo conciso caratteri speciali è in primo luogo tra queste. Tuttavia, sia C # che VB hanno String.Format, il che consente di farlo. In realtà, vorrei ora mai scrivere "x" & Environment.NewLine, e invece sempre usare String.Format("x{0}", Environment.Newline)ecc Eppure, C # è più conveniente qui.
Konrad Rudolph,

@KonradRudolph, sceglierei "x" & nl & nlo "x" + nl + nlo "x" . $nl . $nlun giorno qualsiasi "x\n\n". Anche "x" + bs + bs finito "x\\\\". E "x" + q + qoltre "x\"\""/ "x""""". Ora, per quanto riguarda String.Format, questo è un altro problema non correlato al confronto che stiamo facendo sopra.
Pacerier,

10

http://msdn.microsoft.com/en-us/library/aa691090.aspx

C # supporta due forme di valori letterali stringa: valori letterali stringa regolari e valori 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.


9

Questa è una stringa testuale e modifica le regole di escape - l'unico carattere che è ora sottoposto a escape è ", con escape a" ". Questo è particolarmente utile per i percorsi dei file e regex:

var path = @"c:\some\location";
var tsql = @"SELECT *
            FROM FOO
            WHERE Bar = 1";
var escaped = @"a "" b";

eccetera


Non ti manca la @ nel tuo esempio, Marc? O è l'impostazione predefinita quando uso var? Poco confuso ...
Dirk Vollmar,

1
OK - è davvero molto strano. Mi chiedo se l'editor li abbia sgranocchiati?
Marc Gravell

9

Copiato da MSDN :

Al momento della compilazione, le stringhe testuali vengono convertite in stringhe ordinarie con tutte le stesse sequenze di escape. Pertanto, se visualizzi una stringa testuale nella finestra di controllo del debugger, vedrai i caratteri di escape che sono stati aggiunti dal compilatore, non la versione testuale del tuo codice sorgente. Ad esempio, la stringa testuale @"C:\files.txt"apparirà nella finestra di controllo come "C:\\files.txt".


Che è un tipico pezzo fuorviante della documentazione Microsoft, IMHO! Ciò che precede come risultato finale è corretto, ma la verità sottostante è che le stringhe in C # vengono convertite nella relativa sequenza di byte (o codici carattere multibyte). C # consente due modi diversi di rappresentare la stringa sottostante, con @ "..." o "...". Il debugger sceglie sempre il modo "..." e non può dire quale sia stato utilizzato in primo luogo. (Le sequenze di escape come \ n o "" sono rilevanti solo per la programmazione e la rappresentazione della stringa di livello di visualizzazione e non sono mai memorizzate nella stringa sottostante!)
MikeBeaton

8

Mettere a @ davanti a una stringa ti consente di usare caratteri speciali come una barra rovesciata o virgolette doppie senza dover usare codici speciali o caratteri di escape.

Quindi puoi scrivere:

string path = @"C:\My path\";

invece di:

string path = "C:\\My path\\";

3

La spiegazione è semplice Per rappresentare la stringa "string\", è necessario il compilatore "string\\"perché \è un carattere di escape. Se @"string\"invece lo usi , puoi dimenticartene \\.

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.