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 je suggère toujours que je passe des chaînes régulières à des chaînes textuelles. Quelle est la différence?

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

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

serait

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

Le symbole @ signifie lire cette chaîne littéralement et n’interprète pas 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 réguliers et les littéraux de chaîne textuels.

Un littéral de chaîne régulier se compose de zéro ou plusieurs caractères entre guillemets, comme dans “hello”, et peut inclure 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 guillemet double, de zéro ou plusieurs caractères et d’un caractère de guillemet double. Un exemple simple est @ “bonjour”. Dans un littéral de chaîne textuelle, les caractères entre les délimiteurs sont interprétés textuellement, la seule exception étant une séquence d’échappement de 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 textuels. Un littéral de chaîne textuelle peut couvrir plusieurs lignes.

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

Vous pouvez même avoir de nouvelles lignes littérales dans un littéral de chaîne textuelle. Dans un littéral de chaîne régulier, 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 verbales 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 échappées si un littéral de chaîne régulier est utilisé.

Au moment de l’exécution, il n’y a pas de différence entre les chaînes créées à partir de chaînes littérales régulières et les chaînes créées à partir de chaînes littérales textuelles – elles sont toutes deux du type System.Ssortingng .

Il n’y a pas de différence d’exécution entre une chaîne et une chaîne de caractères. Ils ne sont différents 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 autre qu’une évasion de citation.

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); //comstackr 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 aussi avoir une chaîne multiligne en utilisant des chaînes textuelles:

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

sans @ vous avez une erreur.

Dans VB14, il existe une nouvelle fonctionnalité appelée Multiline Ssortingngs , qui ressemble à des chaînes textuelles en C #.

Cordes multilignes

Astuce Pro: les littéraux de chaîne VB sont désormais exactement comme les chaînes de caractères C # verbatim.

Les chaînes régulières utilisent des séquences d’échappement spéciales pour traduire en caractères spéciaux.

 /* This ssortingng contains a newline and a tab and an escaped backslash\ */ Console.WriteLine("This ssortingng 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 ssortingng displays as is. No newlines\n, tabs\t or backslash-escapes\\. */ Console.WriteLine(@"This ssortingng displays as is. No newlines\n, tabs\t or backslash-escapes\\.");