¿Cuál es la diferencia entre una cadena normal y una cadena textual?

Resuelto Xaisoft asked hace 14 años • 6 respuestas

Tengo una versión de prueba de ReSharper y siempre sugiere que cambie cadenas normales por cadenas textuales. ¿Cuál es la diferencia?

Xaisoft avatar Jul 23 '10 01:07 Xaisoft
Aceptado

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.

 avatar Jul 22 '2010 18:07

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.

Mark Byers avatar Jul 22 '2010 18:07 Mark Byers

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);
Corbin March avatar Jul 22 '2010 18:07 Corbin March