J'ai une version d'essai de Resharper et cela suggère toujours de changer les chaînes régulières en chaînes textuelles. Quelle est la différence?
J'ai une version d'essai de Resharper et cela suggère toujours de changer les chaînes régulières en chaînes textuelles. Quelle est la différence?
Réponses:
Une chaîne verbatim 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 cette chaîne littéralement et n'interpréter les caractères de contrôle autrement.
Ceci est couvert dans la 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 verbatim.
Un littéral de chaîne ordinaire se compose de zéro ou plusieurs caractères entre guillemets, comme dans "bonjour", 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 textuelle se compose d'un caractère @ suivi d'un caractère guillemet double, de zéro ou plusieurs caractères et d'un caractère guillemet double de fermeture. Un exemple simple est @ "bonjour". Dans une chaîne littérale textuelle, les caractères entre les délimiteurs sont interprétés textuellement, la seule exception étant une séquence d'échappement entre guillemets. 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 verbatim. Un littéral de chaîne textuelle peut s'étendre sur plusieurs lignes.
En d'autres termes, le seul caractère spécial dans un @ "littéral de chaîne verbatim" est le caractère guillemet double. 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 textuelle. Dans un littéral de chaîne régulière, 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 verbatim 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 devraient être échappées si une chaîne littérale régulière était utilisée.
Il n'y a aucune différence au moment de l'exécution 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 verbatim - ils sont tous les deux de type System.String
.
Il n'y a pas de différence d'exécution entre une chaîne et une chaîne verbatim. Ils ne sont différents qu'au moment de la compilation. Le compilateur accepte moins de séquences d'échappement dans une chaîne textuelle, donc ce que vous voyez est ce que vous obtenez autre qu'un guillemet d'échappement.
Vous pouvez également utiliser le caractère textuel, @, 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);
Vous pouvez également avoir une chaîne multiligne en utilisant des chaînes verbatim:
Console.WriteLine(@"This
is
a
Test
for stackoverflow");
sans que @
vous ayez une erreur.
Dans VB14, il y a une nouvelle fonctionnalité appelée Multiline Strings
, c'est comme des chaînes textuelles en C #.
Conseil de pro: les littéraux de chaîne VB sont maintenant exactement comme les chaînes verbatim C #.
Les chaînes régulières utilisent des séquences d'échappement spéciales pour se traduire en 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 verbatim 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\\.");