¿Cuál es la diferencia entre una cadena normal y una cadena textual?
Tengo una versión de prueba de ReSharper y siempre sugiere que cambie cadenas normales por cadenas textuales. ¿Cuál es la diferencia?
Una cadena textual es aquella que no necesita escape, 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 otra manera.
Esto se trata en la sección 2.4.4.5 de la especificación C# :
2.4.4.5 Literales de cadena
C# admite dos formas de literales de cadena: literales de cadena regulares y literales de cadena textuales.
Un literal de cadena normal 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 de cadena textual consta de un carácter @ seguido de una comilla doble, cero o más caracteres y una comilla doble de cierre. Un ejemplo sencillo es @"hola". En un literal de cadena textual, los caracteres entre los delimitadores se interpretan textualmente, siendo la única excepción una secuencia de escape entre comillas. En particular, las secuencias de escape simples y las secuencias de escape hexadecimales y Unicode no se procesan en literales de cadena textuales. Un literal de cadena textual puede abarcar varias líneas.
En otras palabras, el único carácter especial en un @"literal de cadena textual" es el carácter de comillas dobles. Si desea escribir una cadena textual que contenga comillas dobles, debe escribir dos comillas dobles. Todos los demás personajes se interpretan literalmente.
Incluso puede tener nuevas líneas literales en una cadena literal literal. En una cadena literal normal no se pueden tener nuevas líneas literales. En su lugar debes usar por ejemplo "\n"
.
Los literales de cadenas textuales suelen ser útiles para incrustar nombres de archivos y expresiones regulares en el código fuente, porque las barras invertidas en este tipo de cadenas son comunes y se necesitarían caracteres de escape si se usara un literal de cadena normal.
No hay diferencia en tiempo de ejecución entre cadenas creadas a partir de literales de cadena normales y cadenas creadas a partir de literales de cadena textuales; ambas son de tipo System.String
.
No existe diferencia de tiempo de ejecución entre una cadena y una cadena textual. Sólo son diferentes en el momento de la compilación. El compilador acepta menos secuencias de escape en una cadena textual, por lo que lo que ves es lo que obtienes aparte de un escape entre comillas.
También puede utilizar el carácter literal, @, para indicarle al compilador 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);