¿Cuál es la diferencia entre una cadena regular y una cadena literal?

Tengo una versión de prueba de Resharper y siempre sugiere que cambie las cadenas regulares por cadenas verbales. ¿Cuál es la diferencia?

Una cadena verbatim es aquella que no necesita ser escapada, como un nombre de archivo:

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

sería

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

El símbolo @ significa leer esa cadena literalmente, y no interpretar los caracteres de control de lo contrario.

Esto se trata en la sección 2.4.4.5 de la especificación C # :

2.4.4.5 Literales de cadenas

C # admite dos formas de literales de cadena: literales de cadena regulares y literales de cadena verbatim.

Un literal de cadena regular consta de cero o más caracteres entre comillas dobles, como en “hola”, y puede incluir secuencias de escape simples (como \ t para el carácter de tabulación) y secuencias de escape hexadecimales y Unicode.

Un literal literario literal consta de un carácter @ seguido de un carácter de comillas dobles, cero o más caracteres y un carácter de comillas dobles de cierre. Un ejemplo simple es @ “hola”. En un literal de cadena verbatim, los caracteres entre los delimitadores se interpretan textualmente, siendo la única excepción una secuencia de escape de cita. En particular, las secuencias de escape simples y las secuencias de escape hexadecimales y Unicode no se procesan en literales literales literales. Una literal litera literal puede abarcar varias líneas.

En otras palabras, el único carácter especial en @ “literal de cadena literal” es el carácter de comillas dobles. Si desea escribir una cadena textual que contiene una comilla doble, debe escribir dos comillas dobles. Todos los demás personajes se interpretan literalmente.

Incluso puede tener nuevas líneas literales en una literal litera literal. En un literal de cadena regular, no puede tener nuevas líneas literales. En su lugar, debe usar, por ejemplo, "\n" .

Los literales de cadenas verbatim a menudo son útiles para incrustar nombres de archivos y expresiones regulares en el código fuente, porque las barras diagonales inversas en estos tipos de cadenas son comunes y deberían escaparse si se utilizara un literal de cadena regular.

No hay diferencia en el tiempo de ejecución entre cadenas creadas a partir de cadenas regulares de literales y cadenas creadas a partir de literales literales literales; ambas son del tipo System.String .

No hay diferencia de tiempo de ejecución entre una cadena y una cadena verbatim. Solo son diferentes en el momento de la comstackción. El comstackdor acepta menos secuencias de escape en una secuencia textual para que lo que ves es lo que obtienes aparte de un escape de cita.

También puede usar el carácter literal @, para decirle al comstackdor que trate una palabra clave como un nombre:

 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); 

También puede tener cadenas multilínea usando cadenas verbatim:

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

sin @ tienes un error.

En VB14 hay una nueva característica llamada Multiline Strings , es como cadenas verbales en C #.

Cuerdas Multiline

Pro tip: los literales de cadena VB ahora son exactamente como las cadenas verbales de C #.

Las cadenas regulares usan secuencias de escape especiales para traducir a caracteres especiales.

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

Las cadenas Verbatim se interpretan tal cual, sin traducir ninguna secuencia de escape:

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