web-dev-qa-db-fra.com

Quel est le @ devant une chaîne en C #?

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

string hello = "hello";

vs.

string hello_alias = @"hello";

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

551
Klaw

Il marque la chaîne en tant que littéral de chaîne mot à mot - tout élément de la chaîne qui serait normalement interprété en tant que séquence d'échappement est ignoré.

Donc, "C:\\Users\\Rich" est identique à @"C:\Users\Rich"

Il existe une exception: une séquence d'échappement est nécessaire pour la citation double. Pour échapper à une citation double, vous devez placer deux guillemets à la suite. Par exemple, @"""" est évalué à ".

693
Richard Everett

C'est un littéral de chaîne textuelle. Cela signifie que s'échapper n'est pas appliqué. Par exemple:

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

Ici verbatim et regular ont le même contenu.

Il permet également des contenus sur plusieurs lignes, ce qui peut s'avérer très pratique pour SQL:

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

Le seul échappement nécessaire pour les littéraux de chaîne textuels consiste à obtenir un guillemet double ("), ce 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.";
239
Jon Skeet

Un '@' a également une autre signification: le placer devant une déclaration de variable vous permet d'utiliser des mots-clés réservés en tant que noms de variables.

Par exemple:

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

J'ai seulement trouvé un ou deux usages légitimes pour cela. Principalement dans ASP.NET MVC lorsque vous souhaitez faire quelque chose comme ceci:

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

Ce 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 normes HTML et n'a pas l'air correct.

56
JulianR

Puisque vous avez également demandé explicitement VB, laissez-moi simplement ajouter que cette syntaxe de chaîne textuelle n'existe pas en VB, mais uniquement en C #. Au lieu de cela, les chaînes toutes sont complètes dans VB (sauf qu'elles ne peuvent pas contenir de sauts de ligne, contrairement aux chaînes complètes C #):

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 double du caractère de citation, comme dans les chaînes de caractères 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 tout autre moyen permettant de construire une chaîne).

string x = "Foo\nbar";

Dans VB, ceci s’écrirait comme suit:

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

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

18
Konrad Rudolph

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 normaux et les littéraux de chaîne textuels.

Un littéral de chaîne standard 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 (telles que\t pour le caractère de tabulation) et des séquences d'échappement hexadécimales et Unicode.

Un littéral de chaîne 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. Un exemple simple est @ "bonjour". Dans un littéral de chaîne textuel, les caractères entre les délimiteurs sont interprétés textuellement, la seule exception étant une séquence quote-escape. 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 textuel peut s'étendre sur plusieurs lignes.

10
Ed Guiness

Ceci est une chaîne textuelle, et modifie 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 les expressions régulières:

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

etc

9
Marc Gravell

Copié à partir de MSDN :

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

9
aanund

Placer un @ devant une chaîne vous permet d'utiliser des caractères spéciaux tels qu'une barre oblique inversée ou des guillemets sans devoir utiliser de codes spéciaux ni de caractères d'échappement.

Pour que vous puissiez écrire:

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

au lieu de:

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

L'explication est simple. Pour représenter la chaîne "string\", le compilateur a besoin de "string\\" car \ est un caractère d'échappement. Si vous utilisez plutôt @"string\", vous pouvez oublier \\.

3
Ray Wu