Question Qu'est-ce que le @ devant une chaîne en C #?


C'est une question .NET pour C # (ou peut-être VB.net), mais j'essaie de comprendre quelle est la différence entre les déclarations suivantes:

string hello = "hello";

contre.

string hello_alias = @"hello";

L'impression sur la console ne fait aucune différence, les propriétés de longueur sont les mêmes.


459
2018-02-17 09:54


origine


Réponses:


Il marque la chaîne comme un verbatim chaîne littérale - n'importe quoi dans la chaîne qui serait normalement interprété comme un séquence d'échappement est ignoré.

Alors "C:\\Users\\Rich" est le même que @"C:\Users\Rich"

Il y a une exception: une séquence d'échappement est nécessaire pour la double citation. Pour échapper à un double guillemet, vous devez mettre deux guillemets doubles à la suite. Par exemple, @"""" évalue à ".


572
2018-02-17 09:57



C'est un verbatim chaîne littérale. Cela signifie que la fuite n'est pas appliquée. Par exemple:

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

Ici verbatim et regular avoir le même contenu

Il permet également des contenus multi-lignes - ce qui peut être très pratique pour SQL:

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

Le seul échappatoire nécessaire pour les littéraux littéraux est d'obtenir un double guillemet (") que vous faites en le doublant:

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

197
2018-02-17 09:57



Un '@' a aussi un autre sens: le mettre devant une déclaration de variable vous permet d'utiliser des mots-clés réservés comme noms de variables.

Par exemple:

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

Je n'ai trouvé qu'une ou deux utilisations légitimes pour cela. Principalement dans ASP.NET MVC quand vous voulez faire quelque chose comme ceci:

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

Qui produirait un lien HTML comme:

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

Sinon, vous devrez utiliser 'Class', qui n'est pas un mot clé réservé, mais le 'C' majuscule ne suit pas les standards HTML et ne semble pas correct.


44
2018-02-17 11:33



Puisque vous avez demandé explicitement VB, laissez-moi ajouter que cette syntaxe verbatim n'existe pas dans VB, seulement en C #. Plutôt, tout les chaînes sont verbatim dans VB (à l'exception du fait qu'elles ne peuvent pas contenir de sauts de ligne, contrairement aux chaînes C # verbatim):

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

Les séquences d'échappement n'existent pas dans VB (à l'exception du doublage du caractère de citation, comme dans les chaînes verbatim C #) ce qui rend certaines choses plus compliquées. Par exemple, pour écrire le code suivant dans VB, vous devez utiliser la concaténation (ou l'un des autres moyens de créer une chaîne)

string x = "Foo\nbar";

En VB, ceci serait écrit comme suit:

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

(& est l'opérateur de concaténation de chaîne VB. + pourrait également être utilisé.)


13
2018-02-17 11:12



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

C # prend en charge deux formes de littéraux de chaîne: les littéraux de chaîne réguliers et les littéraux de chaîne textuels.

Un littéral de chaîne normal se compose de zéro ou plusieurs caractères entre guillemets, comme dans "hello", et peut inclure à la fois des séquences d'échappement simples (comme \ t pour le caractère de tabulation) et des séquences d'échappement hexadécimales et Unicode.

Un littéral littéral textuel se compose d'un caractère @ suivi d'un caractère guillemet double, de zéro caractère ou plus et d'un caractère guillemet double de fermeture. Un exemple simple est @ "bonjour". Dans un littéral littéral verbatim, les caractères entre les délimiteurs sont interprétés textuellement, la seule exception étant une séquence d'échappement de citation. En particulier, les séquences d'échappement simples et les séquences d'échappement hexadécimales et Unicode ne sont pas traitées dans les littéraux de chaîne textuels. Un littéral de chaîne textuelle peut couvrir plusieurs lignes.


8
2018-02-17 09:58



Copié de MSDN:

À la compilation, les chaînes verbatim sont converties en chaînes ordinaires avec toutes les mêmes séquences d'échappement. Par conséquent, si vous affichez une chaîne verbatim dans la fenêtre de surveillance du débogueur, vous verrez les caractères d'échappement qui ont été ajoutés par le compilateur, pas la version verbatim de votre code source. Par exemple, la chaîne verbatim @"C:\files.txt" apparaîtra dans la fenêtre de la montre "C:\\files.txt".


7
2018-02-17 09:59



Ceci est une chaîne verbatim, et change les règles d'échappement - le seul caractère qui est maintenant échappé est ", échappé à" ".Ceci est particulièrement utile pour les chemins de fichiers et regex:

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

etc


6
2018-02-17 09:58



Mettre un @ devant une chaîne vous permet d'utiliser des caractères spéciaux tels qu'une barre oblique inverse ou des guillemets sans avoir à utiliser de codes spéciaux ou de caractères d'échappement.

Donc vous pouvez écrire:

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

au lieu de:

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

6
2018-02-17 09:58