I understand that the @ symbol can be used before a string literal to change how the compiler parses the string. But what does it mean when a variable name is prefixed with the @ symbol?

- 239,200
- 50
- 490
- 574

- 10,360
- 6
- 44
- 67
-
1see http://stackoverflow.com/questions/91817 – Simon Jun 16 '09 at 08:02
4 Answers
The @ symbol allows you to use reserved word. For example:
int @class = 15;
The above works, when the below wouldn't:
int class = 15;

- 27,796
- 4
- 47
- 63
-
38
-
114With an @ symbol, the name is recorded in the assembly as "class", vs. with an underscore it is "_class". Thus, if another .NET language doesn't define "class" as a reserved word, they could use the name just "class". – P Daddy Jan 09 '09 at 20:23
-
52If you used @class for a property name, you could access it like so: MyClass.class instead of MyClass._class – John Sheehan Jan 09 '09 at 20:24
-
3
-
1John, in Delphi, your comment is accurate. Fully qualified names don't need "@" or "&" escaping. Not sure about C#, though. – Rob Kennedy Jan 09 '09 at 20:49
-
1
-
1You shouldn't prefix public members with an underscore as not all .Net languages support it. – Keith Jan 09 '09 at 21:22
-
1
-
19@Vilx- In ASP.net MVC it's very common to use it because that's the only way to express some things. For example if you want to set an element's class attribute you'd type `new { @class = "mc" };` even tho you meant just "class", that's the only way. The point I'm trying to make is that the `@` is **not** part of the actual name of the variable. – MasterMastic Mar 02 '13 at 13:09
-
1Contrary to some people's comments, this is quite useful. I had a WSDL which defined an element name as "return" and this allowed me to populate it without reflection (which is what I was contemplating). – JohnOpincar Aug 08 '17 at 18:39
-
1Here is microsoft official documentation link about @character - https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/verbatim – broadband Nov 02 '18 at 08:36
The @ symbol serves 2 purposes in C#:
Firstly, it allows you to use a reserved keyword as a variable like this:
int @int = 15;
The second option lets you specify a string without having to escape any characters. For instance the '\' character is an escape character so typically you would need to do this:
var myString = "c:\\myfolder\\myfile.txt"
alternatively you can do this:
var myString = @"c:\myFolder\myfile.txt"
-
4
-
1If you put @ before a string literal, it is called "verbatim string literal". – Kamran Bigdely Apr 01 '14 at 17:43
-
Note that with Visual Studio 2015 and up, `$"a string"`allows value interpolation. So `string.Format("Your value is {0}.", value)` can now be `$"Your value is \"{value}\"."`. You can combine these to use literal string interpolation, as in `$@"Your value is ""{value}""."`. (Note the difference in escaping the double quote marks in each version.) – ErikE Jan 25 '16 at 23:31
An important point that the other answers forgot, is that "@keyword" is compiled into "keyword" in the CIL.
So if you have a framework that was made in, say, F#, which requires you to define a class with a property named "class", you can actually do it.
It is not that useful in practice, but not having it would prevent C# from some forms of language interop.
I usually see it used not for interop, but to avoid the keyword restrictions (usually on local variable names, where this is the only effect) ie.
private void Foo(){
int @this = 2;
}
but I would strongly discourage that! Just find another name, even if the 'best' name for the variable is one of the reserved names.

- 48,631
- 24
- 141
- 189
-
5That's probably good advice. I _think_ that the @ qualifier is the equivalent of VB.Net's square bracket, so the VB equivalent would be: dim [Class] as Int32 = 15 – Michael Meadows Jan 09 '09 at 21:01
-
5@Michael It is exactly the equivalent of VB.NET's square bracket syntax. http://stackoverflow.com/questions/6639688/using-keywords-as-identifiers-in-f notes that F# uses double backticks around an identifier for the same purpose. – ClickRick Dec 21 '14 at 11:14
-
4As a late comment - "not that it is THAT useful" - in MVC that is the way you can pass forward a property named "class" to the render e - which turns into html "class" to define the CSS class. – TomTom Feb 27 '16 at 18:00
It allows you to use a C# keyword as a variable. For example:
class MyClass
{
public string name { get; set; }
public string @class { get; set; }
}

- 399,467
- 113
- 570
- 794