Possible Duplicate:
What's the use/meaning of the @ character in variable names in C#?

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?

marked as duplicate by Jeff Atwood May 15 '11 at 6:46



The @ symbol allows you to use reserved word. For example:

int @class = 15;

The above works, when the below wouldn't:

int class = 15;
  • 24
    With what is it any different than, say, an underscore? – Vilx- Jan 9 '09 at 20:15
  • 86
    With 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 9 '09 at 20:23
  • 39
    If you used @class for a property name, you could access it like so: MyClass.class instead of MyClass._class – John Sheehan Jan 9 '09 at 20:24
  • 75
    Just when you think you know everything there is to know about C#, you learn something new. :) – Randolpho Dec 9 '09 at 20:19
  • 16
    @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 2 '13 at 13:09

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"
  • 29
    How it affects strings was exactly what I was looking for. Thanks! – Scott Mar 9 '11 at 15:24
  • 5
    Thank you, the usage of @ for strings was exactly what I was looking for – Oliver Nov 7 '12 at 10:17
  • 3
    You still need to escape double quotes by doubling them. – Justin Skiles Jan 29 '14 at 19:32
  • 5
    This is the better answer IMO – But I'm Not A Wrapper Class Jun 25 '14 at 19:56
  • 3
    @CyberneticTwerkGuruOrc While this is a more detailed answer it goes beyond what the OP asked, the marked answer addresses the specific issue of the @ when used with variables and is therefore (IMO) the more correct answer. – Mike Mar 17 '15 at 8:10

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.

  • 3
    That'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 9 '09 at 21:01
  • 3
    @Michael It is exactly the equivalent of VB.NET's square bracket syntax. stackoverflow.com/questions/6639688/… notes that F# uses double backticks around an identifier for the same purpose. – ClickRick Dec 21 '14 at 11:14
  • 3
    As 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; }
