@ (at) iniciar sesión en la ruta del archivo / cadena

Posible duplicado:
¿Cuál es el @ delante de una cadena para .NET?

Tengo el siguiente código:

new Attachment(Request.PhysicalApplicationPath + @"pdf\" + pdfItem.Value) 

¿Qué hace el signo @ ?

No tiene nada que ver con el archivo de ruta. Cambia el comportamiento de escape de las cadenas.

En un literal de cadena con el prefijo @ las secuencias de escape que comienzan con \ están deshabilitadas. Esto es conveniente para los caminos de archivo ya que \ es el separador de ruta y no desea que comience una secuencia de escape.

En una cadena normal, tendrías que escapar \ into \\ para que tu ejemplo se vea así: “pdf \\”. Pero dado que tiene el prefijo @ el único carácter que necesita escaparse es " (que se escapó como "" ) y simplemente puede aparecer \ .

Esta función es conveniente para cadenas literales que contengan \ tales como rutas de archivos o expresiones regulares.

Para su ejemplo simple, la ganancia no es tan grande, pero la imagen tiene una ruta completa "C:\\ABC\\CDE\\DEF" luego @"C:\ABC\CDE\DEF" ve mucho mejor.

Para expresiones regulares es casi una necesidad. Una expresión regular normalmente contiene varios \ escapes de otros caracteres ya menudo se vuelve casi ilegible si necesita escapar de ellos.

Es una literal litera literal .

Esto permite que la cadena contenga barras invertidas e incluso saltos de línea sin que se manejen de forma diferente:

 string multiLineString = @"First line second line third line"; 

Como las barras diagonales inversas no se usan para escapes, insertar una comilla doble en la cadena requiere que se duplique:

 string withQuote = @"before""after"; 

Los literales de cadena literal se usan generalmente para las rutas de archivos (como lo ha demostrado) y las expresiones regulares, que con frecuencia usan barras diagonales inversas.

Ver mi artículo sobre cadenas para más información.

Le permite ingresar la barra invertida (\) sin escapar de ella:

  var s1 = "C:\\Temp\\MyFileName"; var s2 = @"C:\Temp\MyFileName"; 

Ambos dan como resultado una cadena con los mismos contenidos (y dado que las cadenas se internan en tiempo de comstackción, probablemente incluso la misma referencia de cadena).