38

Possible Duplicate:
What's the @ in front of a string for .NET?

I have the following code:

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

What does the @ sign do?

Community
  • 1
  • 1
Sally
  • 1,749
  • 7
  • 31
  • 39

3 Answers3

107

It has nothing to do with filepath. It changes the escaping behavior of strings.

In a string literal prefixed with @ the escape sequences starting with \ are disabled. This is convenient for filepaths since \ is the path separator and you don't want it to start an escape sequence.

In a normal string you would have to escape \ into \\ so your example would look like this "pdf\\". But since it's prefixed with @ the only character that needs escaping is " (which is escaped as "") and the \ can simply appear.

This feature is convenient for strings literals containing \ such as filepaths or regexes.

For your simple example the gain isn't that big, but image you have a full path "C:\\ABC\\CDE\\DEF" then @"C:\ABC\CDE\DEF" looks a lot nicer.

For regular expressions it's almost a must. A regex typically contains several \ escaping other characters already and often becomes almost unreadable if you need to escape them.

CodesInChaos
  • 106,488
  • 23
  • 218
  • 262
30

It's a verbatim string literal.

This allows the string to contain backslashes and even linebreaks without them being handled differently:

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

As backslashes aren't used for escaping, inserting a double quote into the string requires it to be doubled:

string withQuote = @"before""after";

Verbatim string literals are typically used for file paths (as you've shown) and regular expressions, both of which frequently use backslashes.

See my article on strings for more information.

Blorgbeard
  • 101,031
  • 48
  • 228
  • 272
Jon Skeet
  • 1,421,763
  • 867
  • 9,128
  • 9,194
9

It allows you to enter the backslash (\) without escaping it:

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

Both result in a string with the same contents (and since strings are interned at compile time, probably even the same string reference).

GvS
  • 52,015
  • 16
  • 101
  • 139