¿Cuál es el @ delante de una cadena en C #?

Esta es una pregunta .NET para C # (o posiblemente VB.net), pero estoy tratando de averiguar cuál es la diferencia entre las siguientes declaraciones:

string hello = "hello"; 

vs.

 string hello_alias = @"hello"; 

Imprimir en la consola no hace diferencia, las propiedades de longitud son las mismas.

Marca la cadena como una literal literaria literal : cualquier elemento de la cadena que normalmente se interpretaría como una secuencia de escape se ignora.

Entonces "C:\\Users\\Rich" es lo mismo que @"C:\Users\Rich"

Hay una excepción: se necesita una secuencia de escape para la comilla doble. Para escapar de una comilla doble, debe poner dos comillas dobles en una fila. Por ejemplo, @"""" evalúa a " .

Es una literal litera literal . Significa que el escaparse no se aplica. Por ejemplo:

 string verbatim = @"foo\bar"; string regular = "foo\\bar"; 

Aquí verbatim y regular tienen los mismos contenidos.

También permite contenidos de varias líneas, lo que puede ser muy útil para SQL:

 string select = @" SELECT Foo FROM Bar WHERE Name='Baz'"; 

El único fragmento de escape que es necesario para literales literales literales es obtener una comilla doble (“) que se duplica al doblarla:

 string verbatim = @"He said, ""Would you like some coffee?"" and left."; string regular = "He said, \"Would you like some coffee?\" and left."; 

Una ‘@’ también tiene otro significado: colocarla delante de una statement de variable le permite usar palabras clave reservadas como nombres de variables.

Por ejemplo:

 string @class = "something"; int @object = 1; 

Solo he encontrado uno o dos usos legítimos para esto. Principalmente en ASP.NET MVC cuando quieres hacer algo como esto:

 <%= Html.ActionLink("Text", "Action", "Controller", null, new { @class = "some_css_class" })%> 

Que produciría un enlace HTML como:

 Text 

De lo contrario, tendría que usar ‘Clase’, que no es una palabra clave reservada, pero la ‘C’ mayúscula no sigue los estándares HTML y simplemente no se ve bien.

Ya que explícitamente también pidió VB, permítame agregar que esta syntax de cadena verbatim no existe en VB, solo en C #. Más bien, todas las cadenas son textuales en VB (excepto por el hecho de que no pueden contener saltos de línea, a diferencia de las cadenas verbales de C #):

 Dim path = "C:\My\Path" Dim message = "She said, ""Hello, beautiful world.""" 

Las secuencias de escape no existen en VB (excepto para duplicar el carácter de comillas, como en las cadenas verbales de C #), lo que hace que algunas cosas sean más complicadas. Por ejemplo, para escribir el siguiente código en VB necesita usar concatenación (o cualquiera de las otras formas de construir una cadena)

 string x = "Foo\nbar"; 

En VB esto se escribiría de la siguiente manera:

 Dim x = "Foo" & Environment.NewLine & "bar" 

( & es el operador de concatenación de cadenas VB. + podría ser utilizado igualmente).

http://msdn.microsoft.com/en-us/library/aa691090.aspx

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.

Copiado desde MSDN :

En tiempo de comstackción, las cadenas verbatim se convierten en cadenas ordinarias con todas las mismas secuencias de escape. Por lo tanto, si ve una cadena verbatim en la ventana del reloj del depurador, verá los caracteres de escape que el comstackdor agregó, no la versión literal de su código fuente. Por ejemplo, la cadena verbatim @"C:\files.txt" aparecerá en la ventana del reloj como "C:\\files.txt" .

Esta es una cadena verbatim y cambia las reglas de escape: el único carácter que ahora se escapó es “, escapó a” “. Esto es especialmente útil para las rutas de archivos y expresiones regulares:

 var path = @"c:\some\location"; var tsql = @"SELECT * FROM FOO WHERE Bar = 1"; var escaped = @"a "" b"; 

etc

Poner un @ delante de una cadena le permite usar caracteres especiales como una barra diagonal inversa o comillas dobles sin tener que usar códigos especiales o caracteres de escape.

Entonces puedes escribir:

 string path = @"C:\My path\"; 

en lugar de:

 string path = "C:\\My path\\"; 

La explicación es simple. Para representar la cadena "string\" , el comstackdor necesita "string\\" porque \ es un carácter de escape. Si usa @"string\" lugar, puede olvidarse de \\ .

Poner una “@” delante de cualquier cadena lo convierte en una cadena literal. Un mejor ejemplo sería

 string String1 = "Hello""; 

y

 string String2 = @"Hello\""; 

El primero va a ser un error de syntax donde como el segundo se imprimirá Hola “.