web-dev-qa-db-fra.com

Quelle est la différence entre une chaîne normale et une chaîne textuelle?

J'ai une version d'essai de Resharper et cela suggère toujours que je change de chaîne normale en chaîne mot à mot. Quelle est la différence?

155
Xaisoft

Une chaîne in extenso est une chaîne qui n'a pas besoin d'être échappée, comme un nom de fichier:

string myFileName = "C:\\myfolder\\myfile.txt";

serait

string myFileName = @"C:\myfolder\myfile.txt";

Le symbole @ signifie lire littéralement cette chaîne et ne pas interpréter les caractères de contrôle autrement.

174
alc6379

Ceci est couvert dans section 2.4.4.5 de la spécification C # :

2.4.4.5 Littéraux de chaîne

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.

En d'autres termes, le seul caractère spécial dans un @ "littéral de chaîne textuelle" est le caractère de double citation. Si vous souhaitez écrire une chaîne textuelle contenant un guillemet double, vous devez écrire deux guillemets. Tous les autres caractères sont interprétés littéralement.

Vous pouvez même avoir de nouvelles lignes littérales dans une chaîne littérale. Dans un littéral de chaîne normal, vous ne pouvez pas avoir de nouvelles lignes littérales. Au lieu de cela, vous devez utiliser par exemple "\n".

Les littéraux de chaînes textuelles sont souvent utiles pour incorporer des noms de fichiers et des expressions régulières dans le code source, car les barres obliques inverses dans ces types de chaînes sont courantes et doivent être ignorées si un littéral de chaîne normal était utilisé.

Au moment de l'exécution, il n'y a pas de différence entre les chaînes créées à partir de littéraux de chaîne normaux et les chaînes créées à partir de littéraux de chaîne textuels - elles sont toutes deux de type System.String.

65
Mark Byers

Il n'y a pas de différence d'exécution entre une chaîne et une chaîne textuelle. Ils ne sont différents qu'au moment de la compilation. Le compilateur accepte moins de séquences d'échappement dans une chaîne in extenso.

Vous pouvez également utiliser le caractère @, @, pour indiquer au compilateur de traiter un mot clé comme un nom:

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);
25
Corbin March

Vous pouvez aussi avoir une chaîne multiligne en utilisant des chaînes textuelles:

Console.WriteLine(@"This
    is
    a
    Test
    for stackoverflow");

sans pour autant @ vous avez une erreur.

Dans VB14, une nouvelle fonctionnalité appelée Multiline Strings, c'est comme des chaînes textuelles en C #.

Multiline Strings

Astuce: VB les littéraux de chaîne sont maintenant exactement comme les chaînes C # in extenso.

15

Les chaînes ordinaires utilisent des séquences d'échappement spéciales pour traduire des caractères spéciaux.

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

Les chaînes textuelles sont interprétées telles quelles, sans traduire aucune séquence d'échappement:

/* 
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\\.");
12
BoltClock