Quelle est la différence entre une chaîne régulière et une chaîne verbatim?

166

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?

Xaisoft
la source
3
Je n'ai jamais vu cette suggestion de ReSharper. Pouvez-vous donner un exemple où cela suggère cela?
John Saunders du
3
Je viens de l'avoir. La première suggestion était de le déplacer vers une ressource, mais la seconde était d'en faire une chaîne textuelle: MessageBox.Show ("Un ornithorynque doit être caressé avant que le travail puisse continuer.");
B. Clay Shannon
Je reçois toujours tout le temps. C'est généralement l'un des avertissements de réaffûtage que vous souhaitez désactiver, car il suggère de créer des chaînes textuellement sans aucune raison.
Dean Swiatek
Si vous aimez ma fonctionnalité suggérée pour l'IDE Visual Studio, veuillez voter ici: developercommunity.visualstudio.com/idea/602807/…
Olivier Jacot-Descombes

Réponses:

191

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.

alc6379
la source
12
Je me demande pourquoi Resharper suggère ce changement. Les gourous du CLR savent-ils si les chaînes textuelles sont traitées plus efficacement puisque les caractères d'échappement peuvent être ignorés?
Matt Peterson
9
Je pense que ReSharper le suggère peut-être parce que la chaîne textuelle est plus lisible.
andyp
36
Je crois que c'est une sorte de convention de codage (je n'ai jamais vu ni entendu auparavant). Pour les chaînes, ReSharper suggère de le déplacer dans un fichier de ressources pour la localisation ou de le rendre textuel - pour les chaînes textuelles, ReSharper n'offre plus la possibilité de localiser la chaîne. Il semble donc être une convention de créer toutes les chaînes qui ne nécessitent pas de localisation textuelle.
Daniel Brückner
Disons que nous avons une chaîne de caractères attribuée à la variable de chaîne, string myFileName = "C: \\ myfolder \\ myfile.txt"; Maintenant, je veux convertir la variable de chaîne myFileName en chaîne verbatim. Comment fait-on ça? Est-ce que ça marche? string verbatimStr = @myFileName;
sanjeev bhusal
3
@sanjeevbhusal: Vous ne faites jamais vraiment ça. @ "C: \ myfolder \ myfile.txt" et "C: \\ myfolder \\ myfile.txt" sont la même chose pour le CLR. C'est juste du sucre syntaxique, en gros.
alc6379
68

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.

Mark Byers
la source
27

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);
Corbin mars
la source
16

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 #.

Chaînes multilignes

Conseil de pro: les littéraux de chaîne VB sont maintenant exactement comme les chaînes verbatim C #.

Mohamad Shiralizadeh
la source
13

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\\.");
BoltClock
la source
0

Si vous souhaitez supprimer les avertissements Resharper, vous pouvez utiliser:

Localizable(false)

Pour des choses comme les paramètres, les emplacements de fichiers, par exemple. cela pourrait être une bonne solution.

Et toi
la source