190 votes

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

J'ai une version d'essai de ReSharper et il me suggère toujours de passer des chaînes régulières aux chaînes verbatim. Quelle est la différence ?

4 votes

Je n'ai jamais vu cette suggestion de ReSharper. Pouvez-vous donner un exemple où il suggère cela ?

4 votes

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 de caractères verbatim : MessageBox.Show("Un ornithorynque doit être caressé avant de pouvoir travailler.") ;

1 votes

J'en ai encore tout le temps. C'est généralement l'un des avertissements de resharper que vous voulez désactiver, parce qu'il suggère de faire des chaînes verbatim sans aucune raison.

217voto

alc6379 Points 410

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 qu'il faut lire cette chaîne littéralement, et ne pas interpréter les caractères de contrôle autrement.

12 votes

Je me demande pourquoi Resharper suggère ce changement. Un gourou du CLR sait-il si les chaînes verbatim sont traitées plus efficacement depuis que les caractères d'échappement peuvent être ignorés ?

9 votes

Je pense que ReSharper le suggère peut-être parce que la chaîne verbatim est plus lisible.

40 votes

Je crois qu'il s'agit d'une sorte de convention de codage (que je n'ai jamais vue ou entendue auparavant). Pour les chaînes de caractères, ReSharper suggère soit de les déplacer dans un fichier de ressources pour la localisation, soit de les rendre verbatim - pour les chaînes verbatim, ReSharper n'offre plus l'option de localiser la chaîne. Il semble donc que ce soit une convention de rendre verbatim toutes les chaînes qui n'ont pas besoin d'être localisées.

71voto

Mark Byers Points 318575

Ce sujet est traité dans section 2.4.4.5 de la spécification C# :

2.4.4.5 Littéraux de chaîne de caractères

C# prend en charge deux formes de chaînes de caractères : les chaînes de caractères normales et les chaînes de caractères verbatim.

Un littéral de chaîne régulière est constitué 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 tabulation) et les séquences d'échappement hexadécimales et Unicode.

Une chaîne littérale verbatim est constituée d'un caractère @ suivi d'un caractère double guillemet, de zéro ou plusieurs caractères et d'un caractère double guillemet de fermeture. Un exemple simple est @"hello". Dans une chaîne de caractères verbatim, les caractères entre les délimiteurs sont interprétés verbatim, 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 chaînes de caractères verbatim. Une chaîne de caractères verbatim 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. Si vous souhaitez écrire une chaîne verbatim contenant un double guillemet, vous devez écrire deux doubles guillemets. Tous les autres caractères sont interprétés littéralement.

Vous pouvez même avoir des nouvelles lignes littérales dans une chaîne littérale verbatim. Dans une chaîne de caractères normale, vous ne pouvez pas avoir de nouvelles lignes littérales. Au lieu de cela, vous devez utiliser par exemple "\n" .

Les chaînes littérales verbatim sont souvent utiles pour intégrer 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 pas de différence au moment de l'exécution entre les chaînes créées à partir de chaînes littérales normales et les chaînes créées à partir de chaînes littérales verbatim - elles sont toutes deux de type System.String .

29voto

Corbin March Points 18522

Il n'y a pas de différence d'exécution entre une chaîne de caractères et une chaîne de caractères verbatim. Elles ne sont différentes qu'au moment de la compilation. Le compilateur accepte moins de séquences d'échappement dans une chaîne verbatim, donc ce que vous voyez est ce que vous obtenez, à l'exception des guillemets.

Vous pouvez également utiliser le caractère verbatim, @, 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);

22voto

Vous pouvez également avoir des chaînes multilignes en utilisant des chaînes verbatim :

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

sans @ vous avez eu une erreur.

Dans VB14, il existe une nouvelle fonctionnalité appelée Multiline Strings c'est comme les chaînes de caractères verbatim en C#.

Multiline Strings

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

13voto

BoltClock Points 249668

Les chaînes régulières utilisent des séquences d'échappement spéciales pour être traduites 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 les séquences 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\\.");

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X